Python——類屬性/例項屬性
原文地址:http://blog.csdn.net/bolike/article/details/21554901
一、類屬性
類屬性僅與其被定義的類相繫結。類資料屬性僅當需要有更加“靜態”資料型別時才變得有用,它和任何例項都無關。
1. 類的資料屬性
資料屬性僅僅是所定義的類的變數。這種屬性已被 OO 程式設計師所熟悉,即靜態變數,或者是靜態資料。它們表示這些資料是與他們所屬的類物件繫結的,不依賴於任何類例項。靜態成員通常僅用來跟蹤與類相關的值。
- >>> class C(object):
-
... foo = 100
- ...
- >>> print(C.foo)
- 100
- >>> C.foo = C.foo + 1
- >>> print(C.foo)
- 101
- >>> class MyClass(object):
- ... def myNoActionMethod(self):
- ... pass
- ...
- >>> mc = MyClass()
- >>> mc.myNoActionMethod()
任何像函式一樣對 myNoActiveMethod() 自身的呼叫都將失敗:
- >>> myNoActionMethod()
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- NameError: name 'myNoActionMethod'isnot defined
- >>> MyClass.myNoActionMethod()
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- TypeError: myNoActionMethod() missing 1 required positional argument: 'self'
3. 類的屬性
要知道一個類有哪些屬性,有兩種方法。最簡單的是使用 dir() 內建函式。另外是通過訪問類的字典屬性 __dict__。
- >>> dir(MyClass)
- ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__form
- at__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__',
- '__lt__', '__module__', '__ne__', '__new__', '__qualname__', '__reduce__', '__r
- educe_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook
- __', '__weakref__', 'myVersion', 'showMyVersion']
- >>> MyClass.__dict__
- mappingproxy({'__module__': '__main__', '__qualname__': 'MyClass', '__weakref__'
- : <attribute '__weakref__' of 'MyClass' objects>, 'showMyVersion': <function MyC
- lass.showMyVersion at 0x01D98F18>, '__dict__': <attribute '__dict__' of 'MyClass
- ' objects>, 'myVersion': '1.1', '__doc__': 'MyClass class definition'})
4. 特殊的類屬性
C.__name__ | 類C的名字(字串) |
C.__doc__ | 類C的文件字串 |
C.__bases__ | 類C的所有父類構成的元組 |
C.__dict__ | 類C的屬性 |
C.__module__ | 類C定義所在的模組 |
C.__class__ | 例項C對應的類 |
__name__ 是給定類的字元名字。它適用於那種只需要字串(類物件的名字),而非物件本身的情況。__doc__是類的文件字串,與函式及模組的文件字串相似,必須緊隨頭行後的字串。文件字串不能被派生類繼承,也就是說派生類必須含有他們自己的文件字串。__bases__用來處理繼承,它包含了一個由所有父類組成的元組。__dict__屬性包含一個字典,由類的資料屬性組成。
- >>> MyClass.__name__
- 'MyClass'
- >>> MyClass.__doc__
- 'MyClass class definition'
- >>> MyClass.__bases__
- (<class'object'>,)
- >>> print(MyClass.__dict__)
- {'__module__': '__main__', '__qualname__': 'MyClass', '__weakref__': <attribute
- '__weakref__' of 'MyClass' objects>, 'showMyVersion': <function MyClass.showMyVe
- rsion at 0x01D98F18>, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '
- myVersion': '1.1', '__doc__': 'MyClass class definition'}
二、例項屬性
例項僅擁有資料屬性,它是與某個類的例項相關聯的資料值,這些值獨立於其他例項或類。當一個例項被釋放後,它的屬性同時也被清除了。
1. “例項化”例項屬性
設定例項的屬性可以在例項建立後任意時間進行,也可以在能夠訪問例項的程式碼中進行。構造器 __init__() 是設定這些屬性的關鍵點之一。
2. 檢視例項屬性
內建函式 dir() 可以顯示類屬性,同樣還可以列印所有例項屬性:
- >>> class C():
- ... pass
- ...
- >>> c = C()
- >>> c.foo = 'roger'
- >>> c.bar = 'shrubber'
- >>> dir(c)
- ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__form
- at__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__',
- '__lt__', '__module__', '__ne__', '__new__', '__qualname__', '__reduce__', '__r
- educe_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook
- __', '__weakref__', 'bar', 'foo']
- >>> c.__dict__
- {'foo': 'roger', 'bar': 'shrubber'}
3. 特殊的例項屬性
I.__class__ | 例項化I的類 |
I.__dict__ | I 的屬性 |