如果仅仅只是继承 子类自己没有任何操作 毫无意义 所以要进行重写操作 重写也叫作覆盖
重写:例如魔法方法 与父类方法名相同 在调用时就近原则
继承里面注意就近原则 会覆盖父类的同名方法或属性
单继承: 只继承一个父类
多继承 class 子类名(父类1,父类2)
在Python中,所有类默认继承object类,object类是顶级类或基类;其他子类叫做派生类。
其他父类 为基类 顶级类只能是object
继承:一个类从另一个已有的类获得其成员的相关特性
多层继承: 一级一级的 父类 子类 孙子类 多层级
多继承: 如果多个父类中有同名方法,子类默认就近原则使用第一个父类的同名方法
如果子类自己重写了重名方法,则就近原则 使用自己的
子类调用父类同名方法调用: 注意:: 如果子类就是要调用父类的同名方法 可以在子类内部使用super().方法名() 或者 用父类名.方法名(self)
但super 只能掉 第一个父类的同名函数 在外部使用父类名.方法名(子类对象)
查看继承关系: 类名.mro() 可以查看继承关系 :类名.__mro__可以查看继承关系
派生:从一个已经有的类产生一个新的类,称为派生
继承与派生实际上是从2个方向来进行描述同一个东西的
多态: 同一个函数,随着传入的子类对象的不同,可以实现不同的功能 同一种事务不同的状态 例如所有学生听课
python中的多态为伪多态 有了多态 更容易写出通用的代码 提高代码的可拓展性
真实情况的多态的前提: 继承 , 重写, 父类引用指向子类对象
(python不继承也可以 所以为伪多态) 所以就增加一个判断 isinstance
查看此类是否继承父类if isinstance(self,ani : 父类名) ani = 子类名() :后面是限制因素 在python后面是提示 得用if 进行限制
class Person(object):
def let_ani_jiao(self, ani: Animal): # 正常多态下:后为限制
if isinstance(ani, Animal): # 判断 ani 是否是A的事例对象
ani.jiao()
else:
print(f"{ani}不是动物")
# 2.再根据类创建对象
zs = Person()
# 3.实现多态
zs.let_ani_jiao(Dog()) # 父类引用=子类对象 ani = Dog() ani是个对象 Dog是个类
isinstance函数用于检测是否是实例对象
python 3 对比2 括号里的可以省略 class(object) super(当前类名, self).方法() 括号里的可以省略
实例属性 之前学的属性 属于对象 成员属性 实例属性 ;实例属性只能 对象和 self调用 比如 自己的水杯
类属性: 类名.类属性名 属于类的 所有对象公用的 对象只能读取 添加与修改只能类进行操作 类.类属性 在类中方法外添加修改
eg饮水机 类所拥有的属性 对象只能访问 对象.类属性 不能修改 (本质上是创建了一个与类属性同名的实例属性)
类方法 : 对象可以直接调用 类也可以直接调用 对象.类方法() 类名.类方法() 最大好处 不需要创建对象
所有对象也可以直接调佣
特点:第一个形参位置 cls 也不需要传参 输出cls 为类名 self 则为地址 cls.类属性 可以修改类属性的名
装饰器@classmethod 加上self 就变为cls 实例方法脑袋上加装饰器@classmethod
@staticmethod 静态方法 对象也可以调用 建议 用类名调用 形参位置没有self 也没用cls