每个对象调用后更改属性

时间:2015-03-24 23:18:34

标签: python class attributes call

我试图弄清楚每次调用对象后如何更改某些值。 我认为每次调用后都会执行调用()函数。

这应该是一个简单的计数器类,在调用后会减少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

我做错了什么?

4 个答案:

答案 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)

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

另外,您可以使用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