龙空技术网

Python 面向对象编程(OOP)之: 多重继承 inherit

洪较瘦不着调退役it人 186

前言:

当前同学们对“python 继承 init”大约比较注意,大家都需要了解一些“python 继承 init”的相关内容。那么小编在网摘上搜集了一些关于“python 继承 init””的相关内容,希望朋友们能喜欢,兄弟们一起来学习一下吧!

继续看类的继承

定义一个Dog类

class Dog:    species = "Canis familiaris"    def __init__(self, name, age):        self.name = name        self.age = age    def __str__(self):        return f"{self.name} is {self.age} years old"    def speak(self, sound):        return f"{self.name} says {sound}"
类属性 species = "Canis familiaris"所有的实例对象共享初始化方法__init__实例方法 speak定义三个子类继承Dog类
class JackRussellTerrier(Dog):    passclass Dachshund(Dog):    passclass Bulldog(Dog):    pass

虽然这三个Dog的子类JackRussellTerrier,Dachshund,Bulldog没有内容实际的内容,但是他们拥有父类的相关属性和方法

>>> miles = JackRussellTerrier("Miles", 4)>>> buddy = Dachshund("Buddy", 9)>>> jack = Bulldog("Jack", 3)>>> jim = Bulldog("Jim", 5)
>>> miles.species'Canis familiaris'>>> buddy.name'Buddy'>>> print(jack)Jack is 3 years old>>> jim.speak("Woof")'Jim says Woof'

看一下子类的对象实例类型:miles = JackRussellTerrier("Miles", 4)

>>> type(miles)<class '__main__.JackRussellTerrier'>

可以看到子灰的实例对象的类型是子类

子类实例是父类的实例么?

miles = JackRussellTerrier("Miles", 4)由于JackRussellTerrier继承Dog

>>> isinstance(miles, Dog)True

但是JackRussellTerrier的实例不理其他的子类实例

>>> isinstance(miles, Bulldog)False>>> isinstance(jack, Dachshund)False
>>> isinstance(miles, Bulldog)False>>> isinstance(jack, Dachshund)False
可以得出子类的实例类型是子类子类的实例了是父类的实例子类和子类之间是独立的扩展父类的功能
class JackRussellTerrier(Dog):    def speak(self, sound="Arf"):        return f"{self.name} says {sound}"# ... 
>>> miles = JackRussellTerrier("Miles", 4)>>> miles.speak()'Miles says Arf'

JackRussellTerrier有一个实例方法 speak

class Dog:    # ...    def speak(self, sound):        return f"{self.name} barks: {sound}"

可以看到父类Dogt和子类JackRussellTerrier都有speak方法,,可以看到子灰的实例其实用的是子类自己的speak方法

super关键字子类如何利用你类的一些功能

可以用super()来调用父类的方法

class JackRussellTerrier(Dog):    def speak(self, sound="Arf"):        return super().speak(sound)# ...

这是可以看到A是第一个类,B,C是A的子类,D是B,C的子类对于D类来说如何使用B,C类中的方法呢?

class A(object):    def __init__(self):        print("__init__ ---- A ----") class B(A):    def __init__(self):        print("__init__ ---- B ----")        super(B, self).__init__() class C(A):    def __init__(self):        print("__init__ ---- C ----")        super(C, self).__init__() class D(B, C):    def __init__(self):        print("__init__ ---- D ----")        super(D, self).__init__() d = D()
__init__ ---- D ----__init__ ---- B ----__init__ ---- C ----__init__ ---- A ----

矸多重继承中如何调用不同的父类方法

super关键字

class D(B, C):    def __init__(self):        print("__init__ ---- D ----")        super(B, self).__init__() 
__init__ ---- D ----__init__ ---- C ----__init__ ---- A ----

可以看到实际的输出没有没有执行B的init方法

示完待续:具体原因后面继续探讨

print(D.mro())

__init__ ---- D ----__init__ ---- C ----__init__ ---- A ----[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

标签: #python 继承 init