類的公共屬性

前面的代碼中,我們只給類定義了實例變量,同一個類建立的不同實例的實例屬性可以不同。要實現(xiàn)相同類的實例共享屬性,可以給類定義類屬性和類方法。

1.類屬性

顧名思義,類屬性就是這個屬性是屬于類的,而不是屬于某一個類實例的。例如以下類定義:

class Foo:

   bar = 7

類Foo中沒有定義構造方法,但定義了一個類屬性。類屬性是所有這個類實例的僅有屬性,看具體操作:

>>> class Foo:

         bar= 7

>>> foo = Foo()

>>> foo2 = Foo()

>>> Foo.bar

7

>>> foo.bar

7

>>> foo2.bar

7

>>> Foo.bar = 0

>>> foo.bar

0

>>> foo2.bar

0

以上是再Python交互環(huán)境下運行的結果??煽吹剑xFoo類和實例化之后,不管是Foo.bar,還是查看其實例的bar的值都為7。當調用Foo.bar = 0之后,其實例的bar屬性也都改變成了0。

注意:如果執(zhí)行foo.bar = 3,則此時執(zhí)行的是為foo這個實例添加了一個實例變量bar并賦值為3,并沒有改變Foo的類屬性bar的值,F(xiàn)oo.bar和foo2.bar返回的是類屬性,其值依然是0。而再引用foo.bar則訪問的是foo這個實例的實例變量,所以結果為3。

>>> foo.bar =3

>>> foo2.bar

0

>>> foo.bar

3

>>> Foo.bar

0

>>> foo.bar

3

實際上,foo的實例變量bar和類屬性bar重名了,引用foo.bar時,優(yōu)先引用了實例變量。此時我們可以理解為foo的實例變量遮蓋了其類屬性。而我們一般避免使用foo.bar = 3的形式來改變類的實例,同時也不使用與類屬性同名的實例變量。

2.類方法

下面是一個簡單的類的代碼,定義了一個類方法。

class Foo:

   bar = 3

         @classmethod

         defc_mthd(cls,v):

                   print(cls.a,v)

以下為實例化類后調用結果和直接用類名的調用結果:

>>> f = Foo()

>>> f.c_mthd(0)

3 0

>>> Foo.c_mthd(0)

3 0

類方法是被classmethod裝飾器裝飾的,其第一個參數(shù)必須是cls,用它來代表類自身。其它參數(shù)使用方法與一般方法相同。

注意:類方法中不能使用實例屬性,因為調用時可能還沒有實例化該類,否則會出錯。

3.靜態(tài)方法

靜態(tài)方法在定義時就使用staticmethod裝飾器,其參數(shù)既不用self,也不用cls。從定義形式來看,就像定義一個普通函數(shù)一樣,如果不希望他被封裝在類一起,完全可以在類的外部進行定義一個普通函數(shù),然后在類內的需要的地方直接使用。


class Foo:

         bar=3

         @staticmethod

         defs_mthd(v):

                   print(Foo.bar,v)

以下是其調用方式:

>>> Foo.s_mthd(0)

3 0

>>> f = Foo()

>>> f.s_mthd(0)

3 0

注意:同類方法相同的是靜態(tài)方法中也不能使用實例變量,但可以通過類名來使用類屬性。但一般情況下,我們定義的靜態(tài)方法中不應訪問類及其實例的屬性的。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,590評論 19 139
  • 包(lib)、模塊(module) 在Python中,存在包和模塊兩個常見概念。 模塊:編寫Python代碼的py...
    清清子衿木子水心閱讀 3,913評論 0 27
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向對象的用電信息數(shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,441評論 6 13
  • 我是天空里的一片云, 偶爾投影在你的波心 你不必訝異, 更無須歡喜 在轉瞬間消滅了蹤影。 你我相逢在黑夜的海上, ...
    海鷗ing閱讀 580評論 0 1
  • 你在紐約 我在北京 漫長的歲月里 我只做一件事 專職愛你 如果愛情能成為職業(yè)該有多好 我永遠不會早退 也不...
    小小夢想日記閱讀 576評論 0 1

友情鏈接更多精彩內容