Python類屬性,實例屬性


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章


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM