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是否會在內存中為某對象新申請內存定義該變量。
可以在程序的任何位置給類或者對象定義新的變量