修改後的第一程序
class foo:
foo = 'K-Dawg'
def __str__(self):
print dir(self)
return self.foo
obj = foo()
print obj
修改後的第二計劃
class foo:
def __init__(self):
print locals()
foo = 'K-Dawg'
print locals()
def __str__(self):
print locals()
return self.foo
obj = foo()
print obj
我只是包括一些打印語句。如果你看看每個程序的輸出結果,你將能夠弄清楚到底發生了什麼。
第一個程序將打印
['__doc__', '__module__', '__str__', 'foo']
K-Dawg
我們可以看到,foo
已經存在的對象。實際上,在這種情況下,foo
是一個類變量(與類實例無關,如果來自C,C++或JAVA背景,則可以將其視爲一個靜態變量,它綁定到類而不是Object)。
第二個程序將打印
{'self': <__main__.foo instance at 0x7f528aa90488>}
{'self': <__main__.foo instance at 0x7f528aa90488>, 'foo': 'K-Dawg'}
{'self': <__main__.foo instance at 0x7f11f236d488>}
AttributeError: foo instance has no attribute 'foo'
這顯然告訴我們,變量foo
在__init__
功能得到了創建,但是當它到達__str__
它不可。這意味着在__init__
中創建的foo
變量對於該函數是本地的。
如果你想創建的對象的變量,你應該做這樣的事情
class foo:
def __init__(self):
print locals()
self.foo = 'K-Dawg' # Note the self keyword at the beginning
print locals()
def __str__(self):
print locals()
return self.foo
obj = foo()
print obj
輸出
{'self': <__main__.foo instance at 0x7fe0e2da24d0>}
{'self': <__main__.foo instance at 0x7fe0e2da24d0>}
{'self': <__main__.foo instance at 0x7fe0e2da24d0>}
K-Dawg
self
指向類的當前實例,我們通過做self.foo = 'K-Dawg'
附加一個名爲foo
的變量。這就是爲什麼這是有效的。
就在旁邊注意,'__init__'不是一個構造函數。 – Hyperboreus