Python 面向对象

面向对象编程(OOP) 是一种解决软件复用的设计和编程方法。 这种方法把软件系统中相近相似的操作逻辑和操作 应用数据、状态,以类的型式描述出来,以对象实例的形式在软件系统中复用,以达到提高软件开发效率的作用。简单的说就是基于类和对象的使用。

面向对象

面向对象的三个特征:封装、继承、多态

封装

封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别。

  • 封装数据: 为了保护隐私,明确区分内外数据,对外提供操作该数据的接口
  • 封装方法: 目的是隔离复杂度

继承

在定义一个类的时候可以从当前有的类中进行继承。

python 允许多继承,并且在子类中拥有父类所有的成员变量和方法,为了缓解代码中的冗余,子类在父类的基础上增加的成员变量可以如下修改。

1
2
3
4
5
6
7
8
class Person(object):
def __init__(self):
self.name = name

class Child(Person):
def __init__(self):
Person.__init__(self, name, sex)
self.mother = mother

多态

当子类继承父类之后,成员方法既可以重写也可以不重写。当调用的时候只要保证新方法编写正确,不用管原来的代码

  • 对扩展开放(Open for extension):允许子类重写方法函数
  • 对修改封闭(Closed for modification):不重写,直接继承父类方法函数

鸭子类型: 一些类含有相同的方法,则这些类就互称为鸭子

多继承

MixIn的目的就是给一个类增加多个功能,这样,在设计类的时候,我们优先考虑通过多重继承来组合多个MixIn的功能,而不是设计多层次的复杂的继承关系。

访问限制

private:私有变量以 __ 开头,只有内部能够访问,可以给类增加 get、set 方法
特殊变量: __xxx__, 可以直接访问

initnew 区别

1
2
3
4
__init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。
__new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法。

即,__new__在__init__之前被调用,__new__的返回值(实例)将传递给__init__方法的第一个参数,然后__init__给这个实例设置一些参数。
1
2
3
4
1. __init__ 方法为初始化方法, __new__方法才是真正的构造函数,创建实例。
2. __new__方法默认返回实例对象供__init__方法、实例方法使用。
3. __init__ 方法为初始化方法,为类的实例提供一些属性或完成一些动作。
4. __new__是一个静态方法,而__init__是一个实例方法。

self 和 cls 区别

self 是实例方法定义,cls 主要用在类方法定义。

一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。
而使用 @staticmethod 或 @classmethod,就可以不需要实例化,直接类名.方法名()来调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class A(object):
@staticmethod
def foo1(name): # 静态函数,这种方法与类有某种关系但不需要使用到实例或者类来参与
print(name) # 既可以作为类的方法使用,也可以作为类的实例的方法使用

def foo2(self, name):
print(name)

@classmethod
def foo3(cls, name):
print(name)

a = A()
a.foo1('xyy')
A.foo1('xyy')

a.foo2('xyy')
A.foo2('xyy') # 报错

a.foo3('xyy')
A.foo3('xyy')

@staticmethod 和 @classmethod 都可以直接类名.方法名()来调用