在每个对象调用后更改属性
Change attribute after each object calling
我想知道如何在每次调用对象后更改某些值。
我认为 call() 函数在每次调用后执行。
这应该是一个简单的计数器class,它在调用后减少值属性。
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
我做错了什么?
__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
这可能不是您想要的。
在 meta-class 中定义自定义 call() 方法允许调用 class 时的自定义行为,例如并不总是创建新的 instance.As 没有创建新的 class 实例 call 被调用而不是 init。所以这样做得到想要的结果
print count.value
count()
print count.value
如果您不致力于 类,您可以使用函数并滥用可变类型作为默认初始化程序:
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
# ...
使用 set/initialize 计数器的单个参数调用 counter
。由于初始化实际上是对函数的第一次调用,因此它将return那个数字。
不带参数调用 counter
以获取 "next value"。
(与我建议的非常相似)
或者,对于更接近您问题中所用语法的语法,请使用 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
#...
在这里,您正在创建一个名为 count
的 Counter
对象,然后每次调用 count.value
它 return 的当前值并为通过递减它的内部 val
属性来将来调用。
同样,您第一次请求 value
属性时,它 return 是您初始化它时使用的数字。
如果出于某种原因,您想要 "peek" 下一次调用 count.value
时的结果,而不递减它,您可以查看 count.val
。
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
或者,您可以使用 :
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
我想知道如何在每次调用对象后更改某些值。 我认为 call() 函数在每次调用后执行。
这应该是一个简单的计数器class,它在调用后减少值属性。
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
我做错了什么?
__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
这可能不是您想要的。
在 meta-class 中定义自定义 call() 方法允许调用 class 时的自定义行为,例如并不总是创建新的 instance.As 没有创建新的 class 实例 call 被调用而不是 init。所以这样做得到想要的结果
print count.value
count()
print count.value
如果您不致力于 类,您可以使用函数并滥用可变类型作为默认初始化程序:
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
# ...
使用 set/initialize 计数器的单个参数调用 counter
。由于初始化实际上是对函数的第一次调用,因此它将return那个数字。
不带参数调用 counter
以获取 "next value"。
(与我建议的非常相似
或者,对于更接近您问题中所用语法的语法,请使用 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
#...
在这里,您正在创建一个名为 count
的 Counter
对象,然后每次调用 count.value
它 return 的当前值并为通过递减它的内部 val
属性来将来调用。
同样,您第一次请求 value
属性时,它 return 是您初始化它时使用的数字。
如果出于某种原因,您想要 "peek" 下一次调用 count.value
时的结果,而不递减它,您可以查看 count.val
。
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
或者,您可以使用
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