Python中構造方法的解析(附範例)

不言
發布: 2018-10-10 16:00:05
轉載
3108 人瀏覽過

這篇文章帶給大家的內容是關於Python中建構方法的解析(附範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

Python中會看到前後都加雙底線的函數名,例如 __init__(self),這類寫法在Python中具有特殊的意義。如果物件使用了這類方法中的某一個,那麼這個方法將會在特殊的情況下被執行,然而幾乎不會直接呼叫此類方法。

如果沒有相容舊版Python程式碼的需要,我們在編寫程式碼時應將所有類別的寫為新式類別並且使用super函數這樣的特性。

在Python3.0中沒有"舊式"的類別,也不需要俠士的子類化Object或將元類別設定為type(程式碼起始行__metaclass__=type).那是因為所有的類別都是隱式的成為Object的子類別。如果沒有明確超類的話,就會直接子類化;否則間接子類化。

Python中的建構方法

建構方法與其他方法不同,當一個物件被建立後,會立即呼叫建構方法。

重寫一般方法和特殊的建構方法:

了解繼承的概念後我們知道,每個類別都可能擁有一個或多個超類,子類別從父類別那裡繼承父類別的一些行為方式。不僅如此,我們也可以重寫一些超類別的方法來自訂繼承行為。

class Bird:
    def __init__(self):
        self.hungry=True
    def eat(self):
        if self.hungry:
            print('我在吃')
            self.hungry=False
        else:
            print('我吃饱了,谢谢')
sb=Bird()
sb.eat()
sb.eat()
登入後複製

列印結果:

我在吃
我吃饱了,谢谢
登入後複製

透過程式碼可知道,鳥吃飽以後,將飢餓狀態改為Flase,說明小鳥吃飽了,當在調用eat函數時候,則打印我吃飽了,謝謝。這是在通一個類別中的__init__函數的使用。來看擴展案例。吃是鳥類的基本特徵,可以將Bird作為鳥類的基類。現在我們寫一個會唱歌的鳥,因為我們已經寫好了一個鳥的基類,此時僅需繼承它之後,我們的鳥不僅會唱歌而且默認的學會了吃的技能。

class Bird:
    def __init__(self):
        self.hungry=True
    def eat(self):
        if self.hungry:
            print('ahhh')
            self.hungry=False
        else:
            print('no thanks')

class SongBird(Bird):
    def __init__(self):

        self.sound='Squawk'

    def sing(self):
        print(self.sound)
sb=SongBird()
sb.sing()
sb.eat()
sb.eat()
登入後複製

列印結果:

Traceback (most recent call last):
Squawk
  File "F:/Python培训/博客园随笔专用/文件操作/文件读写.py", line 20, in <module>
    sb.eat()
  File "F:/Python培训/博客园随笔专用/文件操作/文件读写.py", line 5, in eat
    if self.hungry:
AttributeError: &#39;SongBird&#39; object has no attribute &#39;hungry&#39;
登入後複製

不幸的是,我們的鳥可以觸發唱歌的功能,但當呼叫父類的吃的功能時,就拋出了異常。再來看父類別中定義的eat函數,啟動eat函數需要設定hungry屬性。但不解的是,我們已經繼承了鳥的基類Bird,Bird裡也定義了hungry為什麼不行。那是因為hungry屬性是在當父類別呼叫自己的建構子時才起作用。由此可見,SingBird繼承了Bird的所有功能,卻未觸發Bird的初始化功能。修改以下程式碼

class Bird:
    def __init__(self):
        self.hungry=True
    def eat(self):
        if self.hungry:
            print(&#39;ahhh&#39;)
            self.hungry=False
        else:
            print(&#39;no thanks&#39;)
class SongBird(Bird):
    def __init__(self):
        Bird.__init__(self)
        self.sound=&#39;Squawk&#39;
    def sing(self):
        print(self.sound)
sb=SongBird()
sb.sing()
sb.eat()
sb.eat()
登入後複製

 輸出結果:

Squawk
ahhh
no thanks
登入後複製

透過程式碼可以知道,我們在SongBird的初始化類別時,呼叫了Bird的初始化函數。因此,Bird的建構子得以觸發。現在我們的鳥,不僅能唱歌而且具備基類中吃的行為。

再看它執行過程。 SongBird在初始化自身的同時,又將自己作為參數傳遞給它的父類,也就是告訴父類,你在造我的時候,要賦予我天生的技能(自己知道溫飽)。也就是hungry屬性被設定。

使用Super函數

以上方法是3.0以前的寫法,新式類別中將使用super函數解決以上問題。

class Bird:
    def __init__(self):
        self.hungry=True
    def eat(self):
        if self.hungry:
            print(&#39;ahhh&#39;)
            self.hungry=False
        else:
            print(&#39;no thanks&#39;)
class SongBird(Bird):
    def __init__(self):
        super(SongBird, self).__init__()
        self.sound=&#39;Squawk&#39;
    def sing(self):
        print(self.sound)
sb=SongBird()
sb.sing()
sb.eat()
sb.eat()
登入後複製

目前的類別和物件被當做參數調用,而調用函數返回的物件的任何方法都是調用超類別的方法。總結:顯示的傳遞子類別和子類別物件並且呼叫建構子但隱式的卻是在執行父類別的建構方法。

以上是Python中構造方法的解析(附範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:cnblogs.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!