日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

一文深入了解Python中的繼承知識點_python

作者:宇宙之一粟 ? 更新時間: 2022-12-05 編程語言

1 類繼承

Python 是面向對象的編程語言,因此支持面向對象的三大特性之一:繼承。

繼承是代碼重用的一種途徑,Python 中的繼承就像現實生活中的繼承一樣,子類可以順利繼承父類的屬性或方法。允許我們再對象之間創建復雜且類似現實世界的關系。

繼承父類的類稱為子類、派生類或擴展類,被繼承的類被稱為父類、超類或基類。

在之前的文中學到 Python 中的構造函數,并且每一個類都有一個構造函數 __init__() ,在 Python 中任何類都是繼承于最大的基類 Object,如下所示:

Python 3.10.4 (v3.10.4:9d38120e33, Mar 23 2022, 17:29:05) [Clang 13.0.0 (clang-1300.0.29.30)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> dir(object)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
>>> 

Python 中繼承類的語法如下:

class SubClass(SuperClass):

1.1 繼承的簡單例子

先來看一個簡單的繼承例子,假如有一個 Car 類繼承于更通用的類 Vehicle,然后也可以定義一個 Motorcyle 類,繼承圖如下:

Python 代碼實現如上繼承關系,如下:

class Vehicle:

    def __init__(self, started =  False, speed = 0):
        self.started = started
        self.speed = speed

    def start(self):
        self.started = True
        print("啟動,皮皮蝦我們走")

    def stop(self):
        self.speed = 0

    def increaseSpeed(self, delta):
        if self.started:
            self.speed += delta
            print("Vroooooom!")
        else:
            print("還沒啟動呢!")


class Car(Vehicle):
    trunk_open = False
    def open_trunk(self):
        self.trunk_open = True
    def close_trunk(self):
        self.trunk_open = False

我們的汽車繼承了車輛類的所有方法和變量,但添加了一個額外的變量和兩個方法來操作后備箱。

有時你想覆蓋繼承的 __init__() 函數。為了演示,我們可以創建一個摩托車類。大多數摩托車都有一個中心支架。我們將在初始化時添加輸出或輸入的功能:

class Motorcycle(Vehicle):
    def __init__(self, center_start_out = False):
        self.center_start_out = center_start_out
        super().__init__()
   def start(self):
        print("Sorry, out of fuel!")

需要注意的是,在重寫構造函數時,我們繼承的父類的構造函數不會被改變。如果想要更改這個功能,需要自己調用它。這是通過 super() 函數完成返回父類的引用,然后才能調用父類的構造函數。

class Vehicle:

    def __init__(self, started =  False, speed = 0):
        self.started = started
        self.speed = speed

    def start(self):
        self.started = True
        print("啟動,皮皮蝦我們走")

    def stop(self):
        self.speed = 0

    def increaseSpeed(self, delta):
        if self.started:
            self.speed += delta
            print("Vroooooom!")
        else:
            print("還沒啟動呢!")


class Car(Vehicle):
    trunk_open = False
    def open_trunk(self):
        self.trunk_open = True
    def close_trunk(self):
        self.trunk_open = False

class Motorcycle(Vehicle):
    def __init__(self, center_start_out = False):
        self.center_start_out = center_start_out
        super().__init__()


V = Vehicle()
C = Car()
M = Motorcycle()

print(type(V))
print(type(C))
print(type(M))

print("摩托車是交通工具的實例嗎?",isinstance(M, Vehicle))

super() 函數返回一個代表父類的臨時對象。這用于訪問父類的方法和屬性。在 super() 函數的幫助下,我們還可以訪問被覆蓋的方法。

運行上面代碼的結果如下:

2 繼承的類型

2.1 單繼承

單繼承就是一個子類只有一個基類的繼承方式,顯示圖如下:

最基本的例子如下:

class Animal:
  print("我是動物")

class Cat(Animal):
  print("我是貓")

2.2 多繼承

多繼承就是一個子類可以繼承多個父類的繼承方式,相對于單繼承來說,多繼承更復雜,容易造成菱形繼承問題,即兩個父類同時繼承了一個基類,而子類會包含多個父類的內容,產生代碼歧義。

多繼承結構圖:

語法結構如下:

class A:
  def __init__(self, name):
    self.name = name

  def introduction(self):
    print("我叫", self.name)


class B:
  def __init__(self, age):
    self.age = age

  def introduction(self):
    print("我今年 %d 歲了" % self.age)


class C(A, B):
  pass


c = C(18)
c.introduction()

運行代碼:

我叫 18

從上面的執行結果來看,本來想介紹年齡,最后卻輸出了“我叫 18”,這種現象就是繼承順序導致的,類 A 在類 B 的前面,所以對于同名的屬性和方法子類都會調用 類 A 的。

2.3 多級繼承

當一個類繼承一個子類時,它被稱為多級繼承。繼承子類的類被稱為孫子類。多級繼承會導致孫子和子關系。孫子類可以訪問子類和父類的屬性。

多級繼承結構圖:

class Parent:
    str1 = "Python"


class Child(Parent):
    str2 = " is the best programming?"


class GrandChild(Child):

    def get_str(self):
        print(self.str1 + self.str2)


person = GrandChild()
person.get_str()

運行結果:

Python is the best programming?

在上面的代碼示例中,GrandChild 是 Child 的一個子類,而 Child 是 Parent 的一個子類。因此,GrandChild 可以訪問父類和子類的屬性。

2.4 分層繼承

當多個類繼承同一個類時,稱為分層繼承。結構圖如下:

代碼如下:

class SuperClass:
    x = 2022


class SubClass1(SuperClass):
    pass


class SubClass2(SuperClass):
    pass


class SubClass3(SuperClass):
    pass


a = SubClass1()
b = SubClass2()
c = SubClass3()
print(a.x, b.x, c.x)

運行結果:

(2022, 2022, 2022)

2.5 Python中的混合繼承

一種以上繼承類型的組合稱為混合繼承。結構圖如下:

代碼例子如下:

class X:
    num = 2023


class A(X):
    pass


class B(A):
    pass


class C(A):
    pass


class D(B, C):
    pass


ob = D()
print(D.num)

在上面的代碼示例中,我們結合了多級繼承、多重繼承和分層繼承,因此創建了混合繼承。輸出結果:

2023

3 總結

繼承允許我們定義繼承另一個類的所有方法和屬性的類。父類是繼承的類,也稱為基類、派生類。子類是從另一個類繼承的類,也稱為派生類。

本文介紹了 Python 的繼承方法和繼承的 5 種分類,并在簡單的例子中實踐了各種繼承的方式。但繼承的實際用法可不會像本文這樣簡單,今后介紹更多相關的知識。

原文鏈接:https://juejin.cn/post/7158843760707633166

欄目分類
最近更新