使用方法变量的函数影响类变量

时间:2018-03-16 19:20:42

标签: python function oop variables

假设我有一个类,其方法将函数作为参数。有没有办法让这个函数改变inclass变量?

def f():
    # something here to change MyClass.var

class MyClass:
    def __init__():
        self.var = 1

    def method(self, func):
        #does something
        func()

obj = MyClass()
obj.method(f)
print(obj.var)

3 个答案:

答案 0 :(得分:6)

只需将班级的内部参考 - self - 传递到函数中:

>>> class Class:
        def __init__(self):
            self.var = 1

        def method(self, func):
            func(self)

>>> def func(inst):
        inst.var = 0


>>> cls = Class()
>>> cls.var
1
>>> cls.method(func)
>>> cls.var
0
>>> 

在相关的旁注中,我认为让你的功能成为你班级的一种方法会更清晰,更清晰:

>>> from types import MethodType
>>> 
>>> def func(self):
        self.var = 0


>>> class Class:
        def __init__(self):
            self.var = 1


>>> cls = Class()
>>> cls.var
1
>>> cls.func = MethodType(func, cls)
>>> cls.func()
>>> cls.var
0
>>> 

答案 1 :(得分:0)

这应该有效:

def f(obj):
    obj.var = 2

class MyClass:
    def __init__(self):
        self.var = 1

    def method(self, func):
        # does something
        func(self)

obj = MyClass()
obj.method(f)
print(obj.var)  # --> 2

答案 2 :(得分:0)

由于函数f是在类的范围之外定义的,因此它无法访问类变量。但是,您可以将类变量作为参数传递给f,在这种情况下,它将能够对其执行任何操作。

def f(x):
    return x**2  # just for the demonstration. Will square the existing value\\
  # of the class variable


class MyClass:

    def __init__(self):
        self.var = 2

    def method(self, func):
        #does something
        self.var = func(self.var)

obj = MyClass()
obj.method(f)
print(obj.var)   
>>> 4