1、封装、继承、多态
- 封装
- __属性名 == _类名__属性名
封装数据:内部直接访问、外部通过接口访问
封装方法:隔离复杂度,提高可扩展性
- __属性名 == _类名__属性名
- 继承
- 继承关系:
猫 是 动物
- 派生
python2:
super(子类,self).父类方法()
python3:super().父类方法()
对于super(B,self).方法f()
,先看self是谁的实例,假如是A类,则列出A类的mro列表,再找到mro列表中B类的位置,然后从B类的下一个类开始查找方法f - 组合关系
学生 有 课程
- 抽象类
abc模块
只能被继承,不能被实例化
子类必须继承抽象类的方法
- 继承关系:
- 多态性
- python提倡鸭子类型
即属性看起来像就行,不需要继承抽象类来约束属性
- python提倡鸭子类型
2、绑定方法、非绑定方法
- 绑定到对象
- 无装饰器
调用者:对象(自动传参self对象)、类(手动传参self对象)
- 无装饰器
- 绑定到类
- @classmethod
调用者:类、对象(自动传参cls类)
- @classmethod
- 非绑定方法
- @staticmethod
调用者:类、对象(手动传参)
- @staticmethod
3、反射
- 通过字符串访问属性
hasattr(类/对象,'属性名'))
getattr(类/对象,'属性名',None))
setattr(类/对象,'属性名',值)
delattr(类/对象,'属性名')
4、元类
-
定义类的两种方法
class 类名(基类元组)
:
class A(object, metaclass=type): def __init__(self, name): self.name = name
类名 = type(类名,基类元组,名称空间字典)
class_name = 'A' class_bases = (object,) class_dict = {} class_body = """ def __init__(self, name): self.name = name """ exec(class_body, globals(), class_dict) A = type(class_name, class_bases, class_dict)
-
实例化
# 自定义元类 class MyMeta(type): def __init__(cls, class_name, class_bases, class_dict): super(MyMeta, cls).__init__(class_name, class_bases, class_dict) cls.__instance = None # 单例 def __call__(cls, *args, **kwargs): if not cls.__instance: # 1、创建obj obj = object.__new__(cls) # 2、初始化obj cls.__init__(obj, *args, **kwargs) # 单例 cls.__instance = obj # 3、返回obj return cls.__instance # A = MyMeta(class_name, class_bases, class_dict) class A(object, metaclass=MyMeta): # 2、初始化obj def __init__(self, name): self.name = name a = A('小明') # a = A.__call__('小明')
5、内置方法
__dict__
对象调用:对象内的所有数据属性
类调用:类内的所有数据属性和函数属性__bases__
类调用:查看类的直系父类
类名.mro()
列出所有父类继承属性查询顺序
def __getitem__(self, item):
调用方式:对象['属性']
def __setitem__(self, key, value):
调用方式:对象['属性'] = 值
def __delitem__(self, key):
调用方式:del 对象['属性']
def __getattr__(self, item):
调用方式:对象.属性
def __setattr__(self, key, value):
调用方式:对象.属性 = 值
def __delattr__(self, key):
调用方式:del 对象.属性
def __str__(self):
return 'str'
调用方式:str(对象)
def __del__(self):
调用方式:对象回收时
def __call__(self, *args, **kwargs):
调用方式:类()/对象()
6、描述符
- @property
调用方式:对象.方法名
- @方法名.setter
调用方式:对象.方法名 = 值
- @方法名.deleter
调用方式:del 对象.方法名
__get__
__set__
__delete__