python基础语法——类的继承

单继承


# 子类继承了父类 如果子类重写了父类的同名方法 ,则调用该方法时,优先使用子类的,(其后依次为第一个父类,第二个父类。。。)但是子类还想使用父类这个同名方法

       # 有三种解决方法:

       # 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__方法,最好是先调用父类的这个方法,然后再添加自己的功能

猜你喜欢

转载自blog.csdn.net/qq_36893938/article/details/81006622
今日推荐