[英]Function's attributes when in a class
我可以使用函數的屬性來設置狀態標志,例如
def Say_Hello():
if Say_Hello.yet == True:
print('I said hello already ...')
elif Say_Hello.yet == False:
Say_Hello.yet = True
print('Hello!')
Say_Hello.yet = False
if __name__ == '__main__':
Say_Hello()
Say_Hello()
輸出是
Hello!
I said hello already ...
但是,當嘗試將該函數放入類中時,例如
class Speaker:
def __init__(self):
pass
def Say_Hello(self):
if self.Say_Hello.yet == True:
print('I said hello already ...')
elif self.Say_Hello.yet == False:
self.Say_Hello.yet = True
print('Hello!')
Say_Hello.yet = False
if __name__ == '__main__':
speaker = Speaker()
speaker.Say_Hello()
speaker.Say_Hello()
有這個錯誤:
Traceback (most recent call last):
File "...func_attribute_test_class_notworking.py", line 16, in <module>
speaker.Say_Hello()
File "...func_attribute_test_class_notworking.py", line 9, in Say_Hello
self.Say_Hello.yet = True
AttributeError: 'method' object has no attribute 'yet'
在類中使用函數屬性的正確方法是什么?
Speaker.Say_Hello
和speaker.Say_Hello
是兩個不同的對象。 前者是在class
語句體中定義的函數:
>>> Speaker.Say_Hello
<function Speaker.Say_Hello at 0x1051e5550>
而后者是method
一個實例:
>>> speaker.Say_Hello
<bound method Speaker.Say_Hello of <__main__.Speaker object at 0x10516dd60>>
此外,每次訪問speaker.Say_Hello
,都會獲得不同的method
實例。
>>> speaker.Say_Hello is speaker.Say_Hello
False
你應該只使用self
代替。 無論如何,函數屬性更像是一個沒有明確禁止的意外特性,而不是您應該使用的東西。
class Speaker:
def __init__(self):
self._said_hello = False
def Say_Hello(self):
if self._said_hello:
print('I said hello already ...')
else:
self._said_hello = True
print('Hello!')
如果您想跟蹤Speaker
任何實例是否調用了它的Say_Hello
方法,而不是單獨跟蹤每個實例,請使用類屬性。
class Speaker:
_said_hello = False
def Say_Hello(self):
if self._said_hello:
print('Someone said hello already ...')
else:
type(self)._said_hello = True
print('Hello!')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.