1. 程式人生 > >Python——類屬性/例項屬性

Python——類屬性/例項屬性

原文地址:http://blog.csdn.net/bolike/article/details/21554901

一、類屬性

        類屬性僅與其被定義的類相繫結。類資料屬性僅當需要有更加“靜態”資料型別時才變得有用,它和任何例項都無關。

        1. 類的資料屬性

        資料屬性僅僅是所定義的類的變數。這種屬性已被 OO 程式設計師所熟悉,即靜態變數,或者是靜態資料。它們表示這些資料是與他們所屬的類物件繫結的,不依賴於任何類例項。靜態成員通常僅用來跟蹤與類相關的值。

  1. >>> class C(object):  
  2. ...     foo = 100
  3. ...  
  4. >>> print(C.foo)  
  5. 100
  6. >>> C.foo = C.foo + 1
  7. >>> print(C.foo)  
  8. 101
        2. Methods
  1. >>> class MyClass(object):  
  2. ...     def myNoActionMethod(self):  
  3. ...             pass
  4. ...  
  5. >>> mc = MyClass()  
  6. >>> mc.myNoActionMethod()  
        類 MyClass 中的 myNoActiveMethod() 方法,僅僅是一個作為類定義一部分定義的函式(這使得方法成為類屬性)。這表示 myNoActiveMethod 僅應用在 MyClass 型別的物件(例項)上。

        任何像函式一樣對 myNoActiveMethod() 自身的呼叫都將失敗:

  1. >>> myNoActionMethod()  
  2. Traceback (most recent call last):  
  3.   File "<stdin>", line 1in <module>  
  4. NameError: name 'myNoActionMethod'isnot defined  
        引發了 NameError 異常。這就說明 myNoActionMethod 是一個方法,表示它屬於一個類,而不是全域性空間中的名字。由類物件呼叫此方法也失敗。
  1. >>> MyClass.myNoActionMethod()  
  2. Traceback (most recent call last):  
  3.   File "<stdin>", line 1in <module>  
  4. TypeError: myNoActionMethod() missing 1 required positional argument: 'self'
        為與 OOP 慣例保持一致,Python 嚴格要求,沒有例項,方法是不能被呼叫的。方法必須繫結到一個例項才能直接被呼叫。非繫結的方法可能可以被呼叫,但例項物件一定要明確給出,才能確保呼叫成功。然而,不管是否繫結,方法都是它所在的類的固定屬性,即使它們幾乎總是通過例項來呼叫的。

        3. 類的屬性

        要知道一個類有哪些屬性,有兩種方法。最簡單的是使用 dir() 內建函式。另外是通過訪問類的字典屬性 __dict__。

  1. >>> dir(MyClass)  
  2. ['__class__''__delattr__''__dict__''__dir__''__doc__''__eq__', '__form  
  3. at__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__',  
  4.  '__lt__''__module__''__ne__''__new__''__qualname__''__reduce__', '__r  
  5. educe_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook  
  6. __', '__weakref__', 'myVersion', 'showMyVersion']  
  7. >>> MyClass.__dict__  
  8. mappingproxy({'__module__''__main__''__qualname__''MyClass''__weakref__'
  9. : <attribute '__weakref__' of 'MyClass' objects>, 'showMyVersion': <function MyC  
  10. lass.showMyVersion at 0x01D98F18>, '__dict__': <attribute '__dict__' of 'MyClass  
  11. ' objects>, 'myVersion': '1.1', '__doc__': 'MyClass class definition'})  
        dir() 返回的僅是物件的屬性的一個名字類表,而 __dict__ 返回的是一個字典,它的鍵(key)是屬性名,鍵值(value)是相應的屬性物件的資料值。 

        4. 特殊的類屬性

C.__name__ 類C的名字(字串)
C.__doc__         類C的文件字串
C.__bases__         類C的所有父類構成的元組
C.__dict__         類C的屬性
C.__module__         類C定義所在的模組
C.__class__         例項C對應的類

      __name__ 是給定類的字元名字。它適用於那種只需要字串(類物件的名字),而非物件本身的情況。__doc__是類的文件字串,與函式及模組的文件字串相似,必須緊隨頭行後的字串。文件字串不能被派生類繼承,也就是說派生類必須含有他們自己的文件字串。__bases__用來處理繼承,它包含了一個由所有父類組成的元組。__dict__屬性包含一個字典,由類的資料屬性組成。

  1. >>> MyClass.__name__  
  2. 'MyClass'
  3. >>> MyClass.__doc__  
  4. 'MyClass class definition'
  5. >>> MyClass.__bases__  
  6. (<class'object'>,)  
  7. >>> print(MyClass.__dict__)  
  8. {'__module__''__main__''__qualname__''MyClass''__weakref__': <attribute  
  9. '__weakref__' of 'MyClass' objects>, 'showMyVersion': <function MyClass.showMyVe  
  10. rsion at 0x01D98F18>, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '  
  11. myVersion': '1.1', '__doc__': 'MyClass class definition'}  

二、例項屬性

        例項僅擁有資料屬性,它是與某個類的例項相關聯的資料值,這些值獨立於其他例項或類。當一個例項被釋放後,它的屬性同時也被清除了。

        1. “例項化”例項屬性

        設定例項的屬性可以在例項建立後任意時間進行,也可以在能夠訪問例項的程式碼中進行。構造器 __init__() 是設定這些屬性的關鍵點之一。

        2. 檢視例項屬性

        內建函式 dir() 可以顯示類屬性,同樣還可以列印所有例項屬性:

  1. >>> class C():  
  2. ...     pass
  3. ...  
  4. >>> c = C()  
  5. >>> c.foo = 'roger'
  6. >>> c.bar = 'shrubber'
  7. >>> dir(c)  
  8. ['__class__''__delattr__''__dict__''__dir__''__doc__''__eq__', '__form  
  9. at__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__',  
  10.  '__lt__''__module__''__ne__''__new__''__qualname__''__reduce__', '__r  
  11. educe_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook  
  12. __', '__weakref__', 'bar', 'foo']  
        例項也有一個 __dict__特殊屬性,它是例項屬性構成的一個字典:
  1. >>> c.__dict__  
  2. {'foo''roger''bar''shrubber'}  

        3. 特殊的例項屬性

I.__class__ 例項化I的類
I.__dict__ I 的屬性