如何定义只能被调用一次的可调用对象?

时间:2020-06-12 23:12:47

标签: python

为了演示我想做什么,这是一段代码:

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

要测试我们的课程,我将按照以下步骤操作:

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仅在调用变量中存储一次,而不使用全局变量。

3 个答案:

答案 0 :(得分:8)

cls.called是实例的属性,而不是类。每次创建新对象时,它都会获得其自己的属性,该属性的默认值为False

如果要在所有实例之间共享此内容,则应使用CallOnce.called,而不要使用cls.called

顺便说一句,实例方法的第一个参数的常规名称是selfcls用于类方法。

答案 1 :(得分:2)

因此,您正在尝试保存一些状态。您可以做的是改用对象。

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

答案 2 :(得分:1)

您不需要为此课程。函数可以具有自己的属性。

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)      

输出:

called once
already called