是否可以在python中为函数设置实例变量?

时间:2015-10-14 01:03:53

标签: python python-3.x

假设我有一个可变持续时间的函数。

在没有调整任何参数的情况下,有没有办法在其他一些非父函数中将函数设置在函数外部?

2 个答案:

答案 0 :(得分:2)

使用Python 3.x,您可以使用nonlocal关键字

声明它
def make_slow(action):
    slowDuration = None

    def slowAction(self, colony):
        nonlocal slowDuration
        slowDuration = 10 # It is changing the variable from the scope above

如果您想要从其他地方更改某个值并且您不能返回该值,请尝试执行global ...请注意,这可能会污染您当前的命名空间。

对于更加pythonic的方法,你应该使用像self.slowDuration这样的东西。那是什么对象。

答案 1 :(得分:1)

slowDurationslowAction函数的局部变量。局部变量的要点是它们只能在函数内部访问。

您应该更改slowAction函数,以便它使用在其他位置定义的slowDuration变量,例如作为make_slow显然属于的类的成员变量。

您还可以使slowAction成为覆盖__call__方法的类的实例。

>>> class Counter:
...     def __init__(self):
...         self.count = 0
...     def __call__(self, delta):
...         self.count += delta
...         print(self.count)
...     def set_count(self, c):
...         self.count = c
... 
>>> c = Counter()
>>> c(1)
1
>>> c(3)
4
>>> c(3)
7
>>> c(3)
10
>>> c.set_count(42)
>>> c(-2)
40

您还可以使用一些技巧来使共享变量在函数对象本身上可用:

def makeCounter():
    counter = None
    def counter_func():
        counter.count += 1
        print(counter.count)
    counter = counter_func
    counter.count = 0
    return counter

并像这样使用它:

>>> c = makeCounter()
>>> c()
1
>>> c()
2
>>> c()
3
>>> c()
4
>>> c.count = 42
>>> c()
43
>>> c()
44
>>> c()
45

但总的来说,"聪明"应该避免这样的代码,除非你有充分的理由使用它,因为它使代码库更难理解。