单继承
# 子类继承了父类 如果子类重写了父类的同名方法 ,则调用该方法时,优先使用子类的,(其后依次为第一个父类,第二个父类。。。)但是子类还想使用父类这个同名方法
# 有三种解决方法:
# 01: 父类名.同名方法名(self) **多继承
# Master.make_cake(self)
# 02: super(子类名, self).同名方法名()
# super(Prentice, self).make_cake()
# 03: 02的简写 super().同名方法名() * 单继承
子类在继承的时候,在定义类时,小括号()中为父类的名字
父类的公有属性、方法,会被继承给子类
多继承可以继承多个父类,也继承了所有父类的公有属性和方法
注意:如果多个父类中有同名的 属性和方法,则默认使用第一个父类的属性和方法(根据类的魔法属性mro的顺序来查找)
多个父类中,不重名的属性和方法,不会有任何影响。
如果子类和父类的方法名和属性名相同,则默认使用子类的,叫 子类重写父类的同名方法和属性
Python是以属性命名方式来区分,如果在属性和方法名前面加了2个下划线'__',(魔法方法除外)则表明该属性和方法是私有权限,否则为公有权限。
从类方法和实例方法以及静态方法的定义形式就可以看出来,类方法的第一个参数是类对象cls,那么通过cls引用的必定是类对象的属性和方法;
实例方法的第一个参数是实例对象self,那么通过self引用的可能是类属性、也有可能是实例属性(这个需要具体分析),不过在存在相同名称的类属性和实例属性的情况下,实例属性优先级更高。
父类的私有属性和私有方法不能被子类继承,也不能被子类直接使用
==========================================================================
多继承
子类继承多个父类
# 当子类继承父类
# -如果多个父类的方法名相同(make_cake) 子类默认会继承含有该方法的最前面的父类的方法(Master)
-如果多个父类的属性名相同,子类也会继承具有该同名属性的最前面父类的属性
- 为什么会继承第一个父类的属性?
- 答:因为两个父类都有init方法默认会继承第一个也就是会执行第一个init 会在第一个init方法中
# 当子类继承了父类 而且子类重写了父类的同名方法 但是子类还想调用父类的这个同名方法,在子类内部可以
# 格式: 父类名.同名方法(self)
# 如果自定义类中有的属性和方法进行私有后,只能在类内部直接访问私有属性和私有方法。使用其这个类创建的对象在类的外面 不能访问私有的属性和方法
# 实例属性
# 相同的类 创建出来的不同的对象;不同的对象 相同的属性名 但是需要保存不同的属性值所以需要单独开辟内存空间
# 实例方法
# 相同的类 创建出来的不同的对象 调用的是相同的方法,存放在相同的地址中
# 可以通过实例方法的第一个形参self来判断通过哪个对象调用的这个方法
静态方法中不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过类对象来引用
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。
__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供
__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例
__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值
__init__方法往往是用来对创建完的对象进行初始化工作,如果在子类中重写了父类的__init__方法,即意味着父类中的很多初始化工作没有做,这样就不保证程序的稳定了,所以在以后的开发中,如果重写了父类的__init__方法,最好是先调用父类的这个方法,然后再添加自己的功能