为了演示我想做什么,这是一段代码:
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
仅在调用变量中存储一次,而不使用全局变量。
答案 0 :(得分:8)
cls.called
是实例的属性,而不是类。每次创建新对象时,它都会获得其自己的属性,该属性的默认值为False
。
如果要在所有实例之间共享此内容,则应使用CallOnce.called
,而不要使用cls.called
。
顺便说一句,实例方法的第一个参数的常规名称是self
。 cls
用于类方法。
答案 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