类方法中定义的python函数可以访问self吗?

时间:2019-02-10 22:00:26

标签: python

以此类为例:

class MyClass(object):
    def __init__(self):
        self.attribute = 4

    def my_method(self):
        def my_fun(arg1, arg2):
            self.attribute = 7

        pass

应该允许my_fun访问和更改self.attribute吗?

我可以看到我的编辑器没有在self内部给my_fun上色。

这是我要实现的目标:my_method应该调用一个需要回调的外部函数,该回调带有两个参数arg1arg2。我想通过允许此回调使用在my_method中声明的变量来扩展功能,并且还使my_fun回调向self.log写入一些调试信息。我不太确定这是否适合解决此类问题。

1 个答案:

答案 0 :(得分:3)

是的。 self只是另一个变量。它是python自动将对实例的引用作为第一个参数传入。没什么。

您的内部函数将能够访问self,就好像它是访问常规对象的常规函数​​一样。

class MyClass(object):
    def __init__(self):
        self.attribute = 4

    def my_method(self):
        def my_fun():
            self.attribute = 7

        return my_fun

a = MyClass()
a.my_method()()
print(a.attribute)

输出:

7

您解释的设计很好;它存在的一个问题是“我想通过允许此回调使用在my_method中声明的变量来扩展功能”。

从设计的角度来看,虽然您可以访问在my_method内部定义的变量,但您希望以有意义的方式保存的变量最好是实例中的属性。您将能够修改它们并自动“保存”,而如果要保留在my_method中定义的结果,则必须在函数调用结束时找到另一个放置它们的位置。