本文實例講述了Python面向對象類編寫技術細節。分享給大家供大家參考,具體如下:
類代碼編寫細節
繼續學習類、方法和繼承。
class語句
以下是class語句的一般形式:
class <name>(superclass,...): data = value def method(self,...): self.member = value
在class語句內,任何賦值語句都會產生類屬性,而且還有特殊名稱方法重載運算符。例如,名為__init__的函數會在實例對象構造時調用(如果定義過的話)。
例子
類是命名空間,也就是定義變量名(屬性)的工具。
1.就像函數一樣,class語句是本地作用域,由內嵌的賦值語句建立的變量名,就存在于這個本地作用域內。
2.就像模塊內的變量名,在class語句內賦值的變量名會變成類對象中的屬性。
因為class是復合語句,所以任何種類的語句都可位于其主體內:print、=、if、def等。當class語句自身執行時,class語句內的所有語句都會執行。在class語句內賦值的變量名,會創建類屬性,而內嵌的def則會創建類方法。
例如,把簡單的非函數的對象賦值給類屬性,就會產生數據屬性,由所有實例共享。
>>> class ShareData: spam = 42>>> x = ShareData()>>> y = ShareData()>>> x.spam,y.spam(42, 42)
在這里,因為變量名spam是在class語句的頂層進行賦值的,因此會附加在這個類中,從而為所有的實例共享。我們可通過類名稱修改它,或者是通過實例或類引用它。
>>> ShareData.spam = 99>>> x.spam,y.spam,ShareData.spam(99, 99, 99)
這種類屬性可以用于管理貫穿所有實例的信息。例如,所產生的實例的數目的計數器。
現在,如果通過實例而不是類來給變量名spam賦值時,看看會發生什么:
>>> x.spam = 88>>> x.spam,y.spam,ShareData.spam(88, 99, 99)
對實例的屬性進行賦值運算會在該實例內創建或修改變量名,而不是在共享的類中。
對對象屬性進行賦值總是會修改該對象,除此之外沒有其他的影響。例如,y.spam會通過繼承而在類中查找,但是,對x.spam進行賦值運算則會把該變量名附加在x本身上。
看下面這個例子,可以更容易理解這種行為,把相同的變量名儲存在兩個位置:
>>> class MixedNames: data = 'spam' def __init__(self,value): self.data = value def display(self): print(self.data,MixedNames.data)
當創建這個類的實例的時候,變量名data會在構造函數方法內對self.data進行賦值運算,從而把data附加到這些實例上。
新聞熱點
疑難解答