面向对象
基本
- 支持多继承
- 使用
super
函数调用父类的方法super(type[, object or type]).method(parameters)
- 类属性与方法
- 使用两个下划线声明该属性或方法为私有
- 私有属性:
__private_attris
- 私有方法:
__private_method
- 私有属性:
- 使用两个下划线声明该属性或方法为私有
- 支持运算符重载
动态语言
- Python类型的动态性使得我们可以动态为自定义类及其对象增加新的属性和行为,称为混入机制
types.MethodType(method, object)
用户自定义类实例方法的类型import types class Person(object): def __init__(self, name): assert isinstance(name, str) self.name = name def sing(self): print('sing something') def walk(self): print('walk') if __name__=='__main__': zhang = Person('zhang') # add a new method to the object dynamically zhang.sing = types.MethodType(sing, zhang) zhang.walk = types.MethodType(walk, zhang) # delete a method from the object del zhang.walk
- 函数与方法的区别:方法指与特定实例绑定的函数,通过对象对用方法时,对象本身将被作为第一个参数隐式传递,而普通函数则不具备这个特点
class Demo:
pass
t = Demo()
def test(self, v):
self.value = v
t.test = test
t.test #common method
t.test(t, 3) #must transfer a value to the parameter self
t.test = types.MethodType(test, t)
t.test
t.test(5) # do not need to transfer a value to the parameter self, it will be transfered automatically
@property装饰器
- 使用
@property
包装器来包装getter方法,使对属性的访问既安全又方便 - 使用
方法名.setter
装饰器来包装setter方法class p: def __init__(self, x=0, y=0): self.__x = x self.__y = y # read only @property def x(self): return self.__x @property def y(self): return self.__y @x.setter def x(self, value): self.__x = value @y.setter def y(self, value): self.__y = value def __str__(self): return '(%s, %s)' % ((str(self.__x)), str(self.__y)) def main(): p1 = p(37, 39) print(p1) p1.x = 7 p1.y = 9 print(p1) print(p1.x, p1.y) if __name__ == '__main__': main()
__slots__
- Python是一门动态语言,允许我们在程序运行时给对象绑定新的属性或方法,同时也可以进行解绑定
- 我们可以使用
__slots__
来限定对象只能绑定某些属性 __slots__
只对当前的类生效,对子类不起作用__slots__ = ('name', 'gender', 'age')
静态方法
- 缺少
self
或cls
这样的特殊参数 - 需要使用
@staticmethod
修饰
类方法
- 代表的是当前类相关的信息的对象
类本身也是一个对象,称之为类的元数据对象
- 类方法的第一个参数约定名为
cls
- 通过这个参数,我们可以获取和类像个的信息并且可以创建出类的对象
- 需要使用
@classmethod
修饰
类之间的关系
- 类之间存在三种关系:
is-a
- 关系:继承或泛化
- 例:学生与人
has-a
- 关系:关联
- 例:部门与员工
use-a
- 关系:依赖
- 例:司机-驾驶-汽车