面向对象串讲
类与对象
__init__
class Person:
school='xxx'
def __init__(self): #对象初始化方法,对象的绑定方法,对象来调用会把对象传过来
self.name='xxx'
p=Person() #类实例化产生对象会调用__init__
print(p.school)
Person.school='uuuu'
p.school='yy'
属性查找
包括数据属性,包括方法
数据属性:对象中找--->类中--->父类(按照mro查找)--->obj py2中没有mro这东西
方法查找:对象的绑定方法--->父类中按照mro列表查找--->obj
绑定方法
定义在类内部,没有被任何装饰器装饰的函数,就是方法
给对象来用 对象.方法()默认把对象自身传过去 * * * *特殊之处
类来调用就是普通函数,有几个值就传几个值
对象之间的交互
把一个对象传到另一个对象中,操作这个对象
例子:人狗大战
三大特性(继承/封装/多态)
继承:
在类名后的括号中要写继承的类,用逗号分隔
py中支持多继承(属性查找顺序)
新式类和经典类:
继承了object的类都叫新式类(py3中都是新式类)
py2中才有新式类,经典类之说
菱形问题的查找:
广度优先:新式类
深度优先:经典类
mro列表
super() 特殊对象,调用父类的方法和属性(严格按照mro列表找的)
self和super的区别:self一定是从根上找,super()从当前位置按照mro列表查找
类名.方法() 就是个普通函数,这个就不按照mro列表找了,指名道姓地来用
派生: 子类多出来的属性,方法
多态和多态性
多态是指一个事物的多种形态
多态性是指执行同一个事物的同一个方法,表现出来的结果是不一样的
两种实现限制子类的方法 一个abc模块/raise抛异常
鸭子类型
走路像鸭子,叫声像鸭子,你就是鸭子
len()函数返回对象实例的“长度”
调用对象.__len__
()
封装
把属性和方法隐藏
以__
开头,就会隐藏
并没有实际隐藏,其实是做了变形
隐藏属性:保证数据安全
隐藏方法:隔离复杂度
property装饰器 包装成数据属性
其他两个装饰器:
classmethod:类的绑定方法:可以类来调用会自动把类传入(对象也可以调用)
staticmethod: 静态方法,谁都可以调用,不会自动传参数
元类
-__call__
-__new__
-__getattr__
-__setattr__
-__delattr__
_type和object
反射(通过字符串去获取,删除,修改,对象的属性或方法)
-hasattr
-getattr
-setattr
-delattr
isinstance和issubclass