我试图弄清楚每次调用对象后如何更改某些值。 我认为每次调用后都会执行调用()函数。
这应该是一个简单的计数器类,在调用后会减少value属性。
class counter():
def __init__(self,value):
self.value = value
def __call__(self):
self.value -= 1
count = counter(50)
print count.value
print count.value
>> 50
>> 50 <-- this should be 49
我做错了什么?
答案 0 :(得分:3)
__call__
调用对象时才会调用 ()
要调用此行为,您必须执行
class counter():
def __init__(self,value):
self.value = value
def __call__(self):
print 'called'
self.value -= 1
count = counter(50)
print count.value
count()
print count.value
这可能不是您想要做的。
答案 1 :(得分:3)
如果你没有提交给类,你可以使用mutable-types-as-default-initializers来使用函数和滥用:
def counter(init=None, container=[0]):
container[0] -= 1
if init is not None: container[0] = init
return container[0]
x = counter(100)
print(x) # 100
print( counter() ) # 99
print( counter() ) # 98
print( counter() ) # 97
# ...
使用单个参数调用counter
来设置/初始化计数器。由于初始化实际上是对函数的第一次调用,因此它将返回该数字。
在没有参数的情况下调用counter
以获取&#34;下一个值&#34;。
(非常类似于我的建议here)
或者,如果语法更接近问题中的内容,请使用properties:
class Counter(object):
def __init__(self, init):
self.val = init
@property
def value(self):
val = self.val
self.val -= 1
return val
count = Counter(50)
print(count.value) # 50
print(count.value) # 49
print(count.value) # 48
print(count.value) # 47
#...
在这里,您要创建一个名为Counter
的{{1}}对象,然后每次调用count
时,它都会返回当前值,并通过递减它来为将来的调用做好准备#39;内部count.value
属性。
同样,第一次请求val
属性时,它会返回您初始化它的数字。
如果由于某种原因,你想要&#34;偷看&#34;在下一次调用value
时,如果不减少,您可以查看count.value
。
答案 2 :(得分:2)
class counter:
def __init__(self, value):
self._value = value + 1
@property
def value(self):
self._value -= 1
return self._value
count = Counter(50)
print(count.value) # 50
print(count.value) # 49
另外,您可以使用closure:
def Counter(n):
n += 1
def inner():
n -= 1
return n
return inner
虽然每次要使用时都必须调用它
count1 = Counter(50)
count2 = Counter(50)
print(count1()) # 50
print(count1()) # 49
print(count2()) # 50
print(count2()) # 49
print(count1()) # 48
答案 3 :(得分:0)
在元类中定义自定义调用()方法允许在调用类时自定义行为,例如并不总是创建一个新的实例。由于没有创建新的类实例,所以调用调用而不是 init 。这样做是为了获得所需的结果
print count.value
count()
print count.value