在每个对象调用后更改属性

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
#...

在这里,您正在创建一个名为 countCounter 对象,然后每次调用 count.value 它 return 的当前值并为通过递减它的内部 val 属性来将来调用。

同样,您第一次请求 value 属性时,它 return 是您初始化它时使用的数字。

如果出于某种原因,您想要 "peek" 下一次调用 count.value 时的结果,而不递减它,您可以查看 count.val

Use the property decorator

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