原創聲明:本文系博主原創文章,轉載或引用請注明出處。
在Python中,對象的屬性分為實例屬性與類屬性;對象的方法分為普通方法、類方法與靜態方法。
一、屬性:
實例屬性在每創造一個實例時都會初始化一遍,不同的實例的實例屬性可能不同;
類屬性在創建類的時候初始化,不同實例的類屬性都相同。如果實例顯示的修改了"類屬性",則"類屬性"被實例屬性覆蓋,
若要再次訪問或修改類屬性,則只能通過 className.propertyName 來調用;當多個實例試圖修改類屬性時可能發生資源競爭,
必要時需要加鎖進行同步。
1)實例屬性:
實例屬性沒有規定必須在哪里定義,但是必須確保實例屬性在調用之前已經被定義,因此常見的做法是在__init__中定義。
調用方法是: instanceName.propertyName 。
注意,定義類時,成員方法第一個參數為self,其實self也是一個形參表示的實例。
2)類屬性:
在類的作用域內聲明,為類及類的所有實例共有。
在內部用 className.propertyName 調用,如果在成員方法中不對 propertyName 進行修改,則也可以用 self.propertyName 調用;
在外部既可以用 className.propertyName ,又可以用 instanceName.propertyName 來調用。
3)私有屬性(方法):
-
- _xx:常用來標記私有屬性,但是外部依然可以訪問更改
- __xx:外部不可通過 instanceName.propertyName 來訪問或者更改,實際是解釋器將其轉化為 _className__propertyName 。
- __xx__:類的magic方法或解釋器使用的一些全局變量的命名規則,要避免使用這種命名規則。
二、方法
1)普通類方法:
def method(self,...):
pass
2)靜態方法:用@staticmethod裝飾器修飾
不能訪問實例屬性,參數不能傳入self,若傳入self,則需要在調用時顯示給定實例。
3)類方法:用@classmethod裝飾器修飾
實例屬性可以覆蓋類屬性,推薦用cls作入口參數。
靜態方法與類方法都可以通過類或者實例來調用。其兩個的特點都是不能夠調用實例屬性
【參考資料】