1.Python類數據屬性:定義在類里面但在函數外面的變量,它們都是靜態的。
#一段很簡單的代碼,但反應了很多 >>> class A(): a=1 #一個類里面有個屬性a >>> a=A() >>> b=A() >>> a.a 1 >>> b.a 1 >>> A.a 1 #這個屬性能被實例和類訪問 >>> a.a=2 >>> b.a 1 >>> A.a 1 #改變實例a的屬性a,實例b和類的a並沒有改變 >>> A.a=2 >>> b.a 2 #改變類的屬性,實例的屬性隨着改變,這就好像遺傳一樣,一個物種分化為兩個不同的物種A,B,隨便A物種怎么變,對B不會產生影響,但如果穿越時空,改變了它們祖先的一些特點,那么,A,B都會隨着改變
>>> dir(A)
['__doc__', '__module__', 'a']
默認產生的屬性
C.__name__ 類C的名字(字符串)
C.__doc__ 類C的文檔字符串
C.__bases__ 類C的所有父類構成的元組
C.__dict__ 類C的屬性
C.__module__ 類C定義所在的模塊(1.5 版本新增)
C.__class__ 實例C對應的類(僅新式類中)
>>> A.__module__
'__main__'
Python支持模塊間的類繼承,也就是說你在文件中定義的類都是這個模塊的子類,那么通過from module import class就可以將一個類引入另一個文件,反之也可以定位類的位置
2.Python類實例屬性
定義在__init__()方法里的變量就是實例屬性,這些屬性只有被創建時才會被創建。
>>> class Test(): classVar=2 def __init__(self): self.instanceVar=3 #提醒一下這里要寫self.否則就是個局部變量了,還有__init__沒有返回值 >>> atest=Test() >>> btest=Test() >>> atest.__dict__ {'instanceVar': 3} >>> Test.__dict__ {'__module__': '__main__', 'classVar': 2, '__doc__': None, '__init__': <function __init__ at 0x01E68930>} #注意看實例和類屬性的區別,類有類屬性,但沒有實例屬性,實例有實例屬性,但沒有類屬性,那我們可能會疑惑為什么我們可以通過實例訪問類屬性(就像上面的一樣) #在類實例中查找屬性的時候,首先在實例自己的作用域中查找,如果沒有找到,則再在類定義的作用域中查找。在對類實例屬性進行賦值的時候,實際上會在類實例定義的作用域中添加一個屬性(如果還不存在的話),並不會影響到相應類中定義的同名屬性。
參見http://www.cnblogs.com/frydsh/p/3194710.html
3.當類屬性與實例屬性同名時,一個實例訪問這個屬性時實例屬性會覆蓋類屬性,但類訪問時不會。具體還有很多可以看看Python核心編程13章