在Python中,面向对象编程(OOP)是一种在编程中使用对象和类的编程范例。它的目标是在编程中实现继承、多态、封装等现实世界的实体。OOP 的主要概念是将数据和处理该数据的函数绑定为一个单元,以便代码的其他部分无法访问该数据。
Python 中的面向对象编程概念
- 类
- 对象
- 多态性
- 封装
- 遗产
- 数据抽象
Python类
类是对象的集合。类包含创建对象的原型。它是一个逻辑实体,包含一些属性和方法。
为了理解创建类的必要性,让我们考虑一个示例,假设您想要跟踪可能具有不同属性(如品种和年龄)的狗的数量。如果使用列表,第一个元素可以是狗的品种,而第二个元素可以代表它的年龄。假设有 100 只不同的狗,那么你怎么知道哪个元素应该是哪个呢?如果您想为这些狗添加其他属性怎么办?
Python 类的一些要点:
- 类是通过关键字class 创建的。
- 属性是属于某个类的变量。
- 属性始终是公共的,可以使用点 (.) 运算符进行访问。例如:Myclass.Myattribute
类定义语法:
class ClassName:
# Statement-1
.
.
.
# Statement-N
在 Python 中创建空类
在上面的示例中,我们使用 class 关键字创建了一个名为 Dog 的类。
# Python3 program to
# demonstrate defining
# a class
class Dog:
pass
Python 对象
对象是具有与其关联的状态和行为的实体。它可以是任何现实世界的对象,如鼠标、键盘、椅子、桌子、笔等。整数、字符串、浮点数、甚至数组和字典都是对象。更具体地说,任何单个整数或任何单个字符串都是一个对象。数字12是一个对象,字符串“Hello, world”是一个对象,列表是一个可以容纳其他对象的对象,等等。
一个对象由以下部分组成:
- 状态:用对象的属性来表示。它还反映了对象的属性。
- 行为:它由对象的方法表示。它还反映了一个对象对其他对象的响应。
- 身份:它为对象赋予唯一的名称,并使一个对象能够与其他对象交互。
为了理解状态、行为和身份,让我们以狗类为例(如上所述)。
- 身份可以被认为是狗的名字。
- 状态或属性可以被视为狗的品种、年龄或颜色。
- 该行为可以被认为是狗是在吃东西还是在睡觉。
创建对象
这将创建上面定义的 Dog 类的名为 obj 的对象。在深入研究对象和类之前,让我们了解一些在处理对象和类时将使用的基本关键字。
obj = Dog()
Python类中的self
在Python中,self 是一个特殊的参数,通常作为类方法的第一个参数传递给方法。它表示类的实例(对象)本身。通过使用 self,您可以访问对象的属性和方法,以及修改对象的状态。
Python __init__ 方法
__init__方法类似于 C++ 和 Java 中的构造函数。一旦类的对象被实例化,它就会运行。该方法对于执行您想要对对象执行的任何初始化非常有用。现在让我们定义一个类并使用 self 和 __init__ 方法创建一些对象。
使用类和实例属性创建类和对象
class Dog:
# 类属性
attr1 = "哺乳动物"
# 实例属性
def __init__(self, name):
self.name = name
# 驱动代码
# 创建对象
Rodger = Dog("Rodger")
Tommy = Dog("Tommy")
# 访问类属性
print("Rodger 是一个{}".format(Rodger.__class__.attr1))
print("Tommy 也是一个{}".format(Tommy.__class__.attr1))
# 访问实例属性
print("我的名字是{}".format(Rodger.name))
print("我的名字是{}".format(Tommy.name))
输出:
Rodger 是一个哺乳动物
Tommy 也是一个哺乳动物
我的名字是Rodger
我的名字是Tommy
使用方法创建类和对象
这里,Dog 类定义了两个属性:
- attr1 是设置为值“哺乳动物”的类属性。类属性由该类的所有实例共享。
- __init__ 是一个特殊的方法(构造函数),用于初始化 Dog 类的实例。它有两个参数:self(指正在创建的实例)和name(代表狗的名字)。name 参数用于为 Dog 的每个实例分配名称属性。
talk 方法是在 Dog 类中定义的。此方法打印一个包含狗实例名称的字符串。
代码首先创建 Dog 类的两个实例:Rodger 和 Tommy。为每个实例调用 __init__ 方法,以使用提供的名称初始化其名称属性。在两个实例(Rodger.speak() 和 Tommy.speak())中都调用了 talk 方法,使每只狗都打印一条带有其名称的语句。
class Dog:
# 类属性
attr1 = "哺乳动物"
# 实例属性
def __init__(self, name):
self.name = name
def speak(self):
print("我的名字是{}".format(self.name))
# 驱动代码
# 创建对象
Rodger = Dog("Rodger")
Tommy = Dog("Tommy")
# 访问类方法
Rodger.speak()
Tommy.speak()
输出:
我的名字是Rodger
我的名字是Tommy
Python继承
继承是一个类从另一个类派生或继承属性的能力。派生属性的类称为派生类或子类,派生属性的类称为基类或父类。继承的好处是:
- 它很好地代表了现实世界的关系。
- 它提供了代码的可重用性。我们不必一次又一次地编写相同的代码。此外,它允许我们在不修改类的情况下向类添加更多功能。
- 它本质上是传递性的,这意味着如果B类继承自另一个类A,那么B的所有子类都会自动继承自A类。
继承的类型
- 单继承:单级继承使派生类能够继承单父类的特征。
- 多级继承:多级继承使派生类能够从直接父类继承属性,而直接父类又从其父类继承属性。
- 分层继承:分层继承允许多个派生类从父类继承属性。
- 多重继承:多级继承使一个派生类可以从多个基类继承属性。
Python 中的继承
在下面的代码中,我们创建了两个类,即Person(父类)和Employee(子类)。Employee 类继承自 Person 类。我们可以通过employee类使用person类的方法,如上面代码中的显示函数所示。子类还可以通过details() 方法修改父类的行为。
# 父类
class Person(object):
# __init__ 被称为构造函数
def __init__(self, name, idnumber):
self.name = name
self.idnumber = idnumber
def display(self):
print(self.name)
print(self.idnumber)
def details(self):
print("我的名字是{}".format(self.name))
print("Id号码: {}".format(self.idnumber))
# 子类
class Employee(Person):
def __init__(self, name, idnumber, salary, post):
self.salary = salary
self.post = post
# 调用父类的 __init__
Person.__init__(self, name, idnumber)
def details(self):
print("我的名字是{}".format(self.name))
print("Id号码: {}".format(self.idnumber))
print("职位: {}".format(self.post))
# 创建对象变量或实例
a = Employee('Rahul', 886012, 200000, "实习生")
# 使用类 Person 的实例调用函数
a.display()
a.details()
输出:
Rahul
886012
我的名字是Rahul
Id号码: 886012
职位: 实习生
Python多态性
多态性简单地意味着具有多种形式。例如,我们需要确定给定种类的鸟类是否会飞,使用多态性我们可以使用单个函数来完成此操作。
Python 中的多态性
此代码演示了 Python 类中继承和方法重写的概念。它展示了子类如何覆盖其父类中定义的方法以提供特定行为,同时仍然从父类继承其他方法。
class Bird:
def intro(self):
print("有许多种类的鸟类。")
def flight(self):
print("大多数鸟类能够飞行,但有些不能。")
class Sparrow(Bird):
def flight(self):
print("麻雀能够飞行。")
class Ostrich(Bird):
def flight(self):
print("鸵鸟不能飞行。")
obj_bird = Bird()
obj_spr = Sparrow()
obj_ost = Ostrich()
obj_bird.intro()
obj_bird.flight()
obj_spr.intro()
obj_spr.flight()
obj_ost.intro()
obj_ost.flight()
输出:
有许多种类的鸟类。
大多数鸟类能够飞行,但有些不能。
有许多种类的鸟类。
麻雀能够飞行。
有许多种类的鸟类。
鸵鸟不能飞行。
Python封装
封装是面向对象编程(OOP)的基本概念之一。它描述了包装数据的思想以及在一个单元内处理数据的方法。这对直接访问变量和方法施加了限制,并且可以防止数据的意外修改。为了防止意外更改,对象的变量只能通过对象的方法进行更改。这些类型的变量称为私有变量。
类是封装的一个例子,因为它封装了成员函数、变量等所有数据。
Python 中的封装
在下面的示例中,我们创建了 c 变量作为私有属性。我们甚至无法直接访问该属性,甚至无法更改其值。
# Python程序演示私有成员
# 创建一个基类
class Base:
def __init__(self):
self.a = "JkhxwforGeeks"
self.__c = "JkhxwforGeeks"
# 创建一个派生类
class Derived(Base):
def __init__(self):
# 调用基类的构造函数
Base.__init__(self)
print("调用基类的公共成员: ")
print(self.a) # 访问公共成员
# 主程序
obj1 = Base()
print(obj1.a)
# 取消注释print(obj1.__c)将引发AttributeError
obj2 = Derived() # 这将正常工作
输出:
JkhxwforGeeks
调用基类的公共成员:
JkhxwforGeeks
数据抽象
它向用户隐藏了不必要的代码细节。此外,当我们不想泄露代码实现的敏感部分时,这就是数据抽象的来源。
Python中的数据抽象可以通过创建抽象类来实现。
为什么我们需要面向对象编程
- 让项目的开发和维护更加省力。
- 提供数据隐藏功能,有利于安全问题。
- 如果我们使用面向对象编程,我们就可以解决现实世界的问题。
- 它确保了代码的可重用性。
- 它让我们可以编写通用代码:它将处理一系列数据,因此我们不必一遍又一遍地编写基本内容。
原创文章,作者:jkhxw,如若转载,请注明出处:https://www.jkhxw.com/python-oops-concepts/