簡體   English   中英

如何定義只能調用一次的可調用對象?

[英]How to define a callable that can only be called once?

為了演示我想要做什么,這里有一段代碼:

class CallOnce(object):
    called=False
    def web_service(cls,macid):
        if cls.called:
            print ("already called")
            return
        else:
            # do stuff
            print ("called once")
            cls.called = True
            return macid

為了測試我們的 class,我進行如下操作:

for i in range(2):

    macid = "123"
    call_once_object = CallOnce()
    call = call_once_object.web_service(macid)
    print(call)

預期的結果應該是這樣的:

called once
123
already called

除了我得到這個結果:

called once
123
called once
123

這個想法是在調用變量中只存儲一次值123而不使用全局變量。

cls.called是實例的屬性,而不是 class。 每次創建新的 object 時,它都會獲得自己的屬性,默認為False

如果你想在所有實例之間共享它,你應該使用CallOnce.called ,而不是cls.called

順便說一句,實例方法的第一個參數的常規名稱是self cls用於 class 方法。

因此,您正在嘗試保存一些 state。 您可以做的是改用 object。

class Test():
    def __init__(self):
        self.called = False

    def call_me_maybe(self):
        if (not self.called):
            print('Hey, you called?')
            self.called = True
        else:
            print("Stop calling me it's getting weird")

test = Test()
test.call_me_maybe() #-> Hey, you called?
test.call_me_maybe() #-> Stop calling me it's getting weird

為此,您不需要 class。 函數可以有自己的屬性。

def web_service(macid):
    if hasattr(web_service, 'called'):
        print ("already called")
        return
    else:
        # do stuff
        print ("called once")
        web_service.called = True
        return macid

web_service(5)
web_service(6)      

Output:

called once
already called

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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