文章出處:http://m.survivalescaperooms.com/winstic/,請保留此連接
面向對象是python語言的一大特色,而類又是面向對象編程的核心
先來一段關于類的聲明:
class myClass(object): # 繼承object """It's my first class defined """ # 文檔字符串 version = 1.0 # 靜態成員 testlist = [1, 2, 3] def __init__(self, nm = "john"): """constructor""" self.name = nm def showname(self): """display name""" PRint "your name is: ", self.name def showversion(self): """display version""" print "The version is: ", self.version
在類中聲明的靜態變量(也叫類屬性)version、testlist將被所有實例及類的方法show*所共享
在類的定義中又一個很明顯的特點,每個函數都有一個參數self;什么事self呢?我們可以聯想一下C++中的this指針,沒錯她們有類似的功能,在python中self是類實例的引用,請記住是類實例的引用而不是類本身,那么我想引用實際的類怎么辦,當然沒問題,可以使用self.__class__
__init__()
類實例修改屬性值?
每個類實例只能修改自己的屬性值,可以說在多個類實例中是互不影響的,但這有一個前提:該屬性值必須是不可變對象(為什么?請繼續看...)
雖然可以通過對象改變自己的屬性值,但當您這么做的時候,請擦亮您的火眼金金,看清類屬性是可變還是不可變的類型;當然如果您要改變類屬性時可以使用類名.屬性名 = ××××來實現;下面將簡單分析不可變對象和可變對象在屬性值改變情況下的區別:
>>> # 對不可變對象(number)操作,實例間互不影響>>> test1 = myClass()>>> test2 = myClass()>>> test1.version = 2.0>>> test1.showversion()The version is: 2.0>>> test2.showversion()The version is: 1.0
>>> # 對可變對象(list)操作時,實例間同步更新>>> test1.testlist[0] = 10>>> test1.testlist[10, 2, 3]>>> test2.testlist[10, 2, 3]
當改變類屬性時,如果屬性是immutable的,該屬性會被復制出一個副本,存放在當前對象的__dict__中;而原始類本身對應的值并沒有改變。
>>> test1.__dict__{'version': 2.0, 'name': 'john'}>>> test1.__class__.version1.0>>> test1.__class__.__dict__dict_proxy({'__module__': '__main__', 'version': 1.0, '__init__': <function __init__ at 0x025FFAB0>, '__dict__': <attribute '__dict__' of 'myClass' objects>, '__weakref__': <attribute '__weakref__' of 'myClass' objects>, 'showversion': <function showversion at 0x025FFB30>, 'testlist': [10, 2, 3], '__doc__': "It's my first class defined ", 'showname': <function showname at 0x025FFAF0>})
而如果類屬性值是可變的(mutable),因為還是在原內存地址中操作,并沒有產生相應的副本,同時該值一旦改變會直接更改原始類中的對應屬性值,進而影響其 他對類實例
>>> test1.testlist[10, 2, 3]>>> test1.__class__.testlist[10, 2, 3]>>> test2.testlist[10, 2, 3]
所有當我們通過類實例更改類屬性值時,要特別注意的是:看清類屬性對象是否可變(mutable/immutable),以免產生不必要的錯誤。
新聞熱點
疑難解答