python学习笔记之基础操作(九)类 -2- 继承

版权声明:所有资料资源均应用作教育用途,请勿用作商业用途 https://blog.csdn.net/qq_38876114/article/details/86610902

继承

继承是面向对象的语言中很重要的一个特性,可以进一步增加代码的重用性和整个代码逻辑的顺畅性。python中的继承类似于java,C++中的继承,子类会继承父类的方法和属性,在python中,属性不需要声明,因此不像java中会遇到子类和父类同时声明一个变量的情况,而对于子类和父类都声明的方法来说,子类的方法会被直接调用,想要调用弗雷德额方法需要特殊的处理,这是比较显然的,因为类的相关信息都存放在一个字典中,每一次声明都可以认为是一个对字典value值得赋值。同时,python支持多继承。

格式

python继承的格式如下:

class Animal:
	age = 0
	weight = 10
	def cry(self):
		pass
class Dog(Animal):
	feature = "dog"
	def cry(self):
		print("wangwangwang!")

animal = Animal()
print(Animal.__dict__)
#{'__module__': '__main__', 'age': 0, 'weight': 10, 'cry': <function Animal.cry at 0x000001D29DED47B8>, '__dict__': <attribute '__dict__' of 'Animal' objects>, '__weakref__': <attribute '__weakref__' of 'Animal' objects>, '__doc__': None}

dog = Dog()
print(Dog.__dict__)
#{'__module__': '__main__', 'feature': 'dog', 'cry': <function Dog.cry at 0x000001D29DED4840>, '__doc__': None}
dog.cry()
#wangwangwang!

接口

python中的接口是一个集合,这个集合包含了一些函数,这些函数具有一定的关联性使其必须在继承了这个类的类中实现,比如继承了一个动物类,就必须应该包含死亡,进食等等函数功能,python中没有提供像java一样的interface关键字,普通的继承对于子类是没有约束的,如果想像java接口一样强制子类实现自己规定的方法,就需要使用第三方的包,如下,定义抽象类不需要实现其方法,

import abc
class Animal(metaclass=abc.ABCMeta):
	@abc.abstractmethod
	def dead(self):
		pass
class Dog(Animal):
	def dead(self):
		print("dead")

变量的查找

当引用了一个类的属性时,如果当前类中不存在该属性,就需要向上向其父类中查找是否存在这个属性。对于python来说,由于支持多继承,因此在查找顺序上就存在着一定的问题,因为两个父类中可能同时声明了该变量,这样就无法确定是哪一个父类的变量被修改了,因此需要明确其搜索的顺序,python为继承关系维护了一个链表,查找顺序如下:
在这里插入图片描述在这里插入图片描述python3中统一是新式类,因此按照第二个图进行查找

class A(object):
    def test(self):
        print('from A')

class B(A):
    def test(self):
        print('from B')

class C(A):
    def test(self):
        print('from C')

class D(B):
    def test(self):
        print('from D')

class E(C):
    def test(self):
        print('from E')

class F(D,E):
    # def test(self):
    #     print('from F')
    pass
f1=F()
f1.test()
print(F.__mro__) #只有新式才有这个属性可以查看线性列表,经典类没有这个属性

#新式类继承顺序:F->D->B->E->C->A
#经典类继承顺序:F->D->B->A->E->C
#python3中统一都是新式类
#pyhon2中才分新式类与经典类

子类中调用父类的方法

使用super().xxx()的方式调用父类方法

class Vehicle: #定义交通工具类
     Country='China'
     def __init__(self,name,speed,load,power):
         self.name=name
         self.speed=speed
         self.load=load
         self.power=power

     def run(self):
         print('开动啦...')

class Subway(Vehicle): #地铁
    def __init__(self,name,speed,load,power,line):
        #super(Subway,self) 就相当于实例本身 在python3中super()等同于super(Subway,self)
        super().__init__(name,speed,load,power)
        self.line=line

    def run(self):
        print('地铁%s号线欢迎您' %self.line)
        super(Subway,self).run()

class Mobike(Vehicle):#摩拜单车
    pass

line13=Subway('中国地铁','180m/s','1000人/箱','电',13)
line13.run()

参考博客

猜你喜欢

转载自blog.csdn.net/qq_38876114/article/details/86610902