簡體   English   中英

函數在類中的屬性

[英]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_Hellospeaker.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM