面向对象最本质解决的是: 提供可扩展性
类与对象
程序中必须先有类,再有对象
# 类中有属性,有方法
class Person:
# 类属性
school = 'xxxx'
# 对象的绑定方法,初始化方法完成对象的初始化
def __init__(self,name='hys',age=16):
self.name=name
self.age=age
p = Person('my')
# 对象是不能修改类属性的
# 类属性只能类来该
print(Person.__dict__)
p.school = 'yyyy'
print(p.__dict__)
对象绑定方法: 定义在类内部,没有装饰器装饰的方法,都是对象的绑定方法
需要对象来调用,对象调用的时候,会把自身传入
class Person:
def __init__(slef,name='my'):
self.name=name
self.age=17
def change_name(self,name):
self.name=name
p = Person()
p.change_name('mayue')
# 本质就是
# Person.change_name(p,'mayue')
对象交互
class Person:
def __init__(slef,name='my'):
self.name=name
self.age=17
def change_name(self,name):
self.name=name.upper()
继承:减少代码冗余
继承查找顺序(新式类,经典类)
广度优先(新式类)和深度优先(经典类)
在子类中调用父类的方法
指名道姓
supper(类名,对象).父类的方法名( ) supper 严格按照 mro 列表查找
派生
多态和多态性
控制子类必须实现父类的方法: 第一种方式:abc模块. 第二种模式: 通过抛异常
鸭子类型:只要有指定的绑定方法,那就是鸭子( 不用父类强制约束,人为约束 )
封装
组合也属于封装
隐藏属性和方法
用__放在属性和方法前面: 能把属性和方法隐藏
隐藏属性为了安全
隐藏方法为了隔离复杂度
property: 把方法包装成数据属性
修改,删除 @方法名.setter @方法名.delete
classmethod: 类的绑定方法
staticmethod静态方法(非绑定方法)