如何调用存储在 Python 类实例变量中的函数



我正在将函数作为参数传递给类构造函数。构造函数将其存储在实例变量中,其他类方法想要调用它。

class ComboList(list) :
    def __init__(self,a,b,kg) :
        list.__init__(self)
        self.__kg = kg
        # More stuff follows

当我尝试在另一种方法中调用该函数时,例如:

x = self.__kg('a')

我得到"{属性错误}"对象没有属性'__kg'。

当我在 IDE 的"计算表达式"窗口中计算函数调用时,我得到同样的结果。但是当我计算实例变量本身("self.__kg")时,我得到:

result = {function} <function <lambda> at 0x0000000002ED5C18>

。因此,似乎定义了属性__kg。

出了什么问题?

我可以通过引用参数来调用该函数 - 没问题。

kg(a')

我还可以将参数的值分配给方法变量并调用该变量 - 没问题。

_kag = kg
_kag('a')

只有对实例变量的引用不起作用。

每当一个变量在类中有一个双下划线时,Python 就会调用名称重整(参见 Python 关于类的文档)。使用双下划线几乎只是为了避免与子类发生名称冲突或使变量"真正私有"。(有关更多样式建议,请参阅 PEP8)。

如果希望其他继承的子类使用私有变量,可以使用单个下划线 (_kg ) 或使用@property装饰器。

看看这个非常愚蠢的例子:

class ComboList(list) :
    def __init__(self,a,b,kg) :
        list.__init__(self)
        self.__kg = kg
        # More stuff follows
    @property
    def kg(self):
        return(self.__kg)
my_list = ComboList(1,2,'This will be printed')
print(my_list.kg)

不要使用双下划线,这会使 python 做一些魔法并将类名附加到变量名(称为名称重整)。只需使用单个下划线而不是双下划线。

相关内容

  • 没有找到相关文章

最新更新