python 的類變量和對象變量


python是一種解釋性的語言,任何變量可以在使用的時候才聲明以及定義,也可以在程序運行的任何位置進行聲明和定義新的變量。

class Man(object):
    #直接定義的類的變量,屬於類    
    #其中 gender, avg_height為基本數據類型,immutable
    #lis為列表類型,為mutable的
    gender = 'male'    
    avg_height = 1.75
    lis = ['hello', 'world']

    def __init__(self, name):
        self.name = name  #name在類的構造函數中定義,是屬於對象的變量

   
a = Man('jason')
b = Man('tom')

#通過一個對象a訪問一個變量x,變量的查找過程是這樣的:
#先在對象自身的__dict__中查找是否有x,如果有則返回,否則進入對象a所屬的類A的
#__dict__中進行查找

#對象a試圖修改一個屬於類的 immutable的變量,則python會在內存中為對象a
#新建一個gender變量,此時a就具有了屬於自己的gender變量
a.gender = 'female'

#對象b試圖修改一個mutable的變量,則python找到類Man的__dict__中的變量lis,
#由於lis是可以修改的,因此直接進行修改,而不會給b新生成一個變量。類Man以及類Man
#的所有對象都公用這一個lis
b.lis = ['fuck', 'world']

print a.__dict__ #屬於a的變量,有 name, gender
print b.__dict__  #屬於b的變量,只有name
print Man.__dict__ #屬於類Man的變量,有 gender,avg_height,lis,但是不包括 name
#name是屬於對象的變量

Man.t = 'test' #此時Man的變量又多了t,但是對象a和b中沒有變量t。
#(這里可以看出,對象的變量和類的變量是分開的)

print a.gender  #female
print b.gender  #male

print a.lis #['fuck', 'world']
print b.lis #['fuck', 'world']

a.addr = '182.109.23.1' #給對象a定義一個變量,對象b和類Man中都不會出現(解釋性語言好隨性。。)


    

  需要注意,類的變量(屬性)和對象的變量(屬性)是“獨立”的,但在通過一個對象查找一個變量的時候,會現在改對象自身的__dict__中查找,如果找不到,則進入該對象代表的類的__dict__中進行查找。

  注意 mutable, immutable變量的區別!這會導致python是否會在內存中為某對象新申請內存定義該變量。

  可以在程序的任何位置給類或者對象定義新的變量


免責聲明!

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



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