【问题标题】:How to call a function stored in a Python class instance variable如何调用存储在 Python 类实例变量中的函数
【发布时间】:2015-06-18 16:18:19
【问题描述】:

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

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

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

x = self.__kg('a')

我得到“{AttributeError}''对象没有属性'__kg'。”

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

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

...看来属性__kg 定义了。

出了什么问题?

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

kg(a')

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

_kag = kg
_kag('a')

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

【问题讨论】:

  • 这是name mangling - 试试_ComboList__kg。或者干脆去掉双下划线。
  • 能否请您更新创建ComboList 对象并调用kg 函数的代码?
  • jonrsharpe,这是有道理的,但令人惊讶。我知道名称修饰应该使变量难以在定义它们的范围对象之外意外获取。我没想到它会在范围对象内故意变得困难。 @Anand,尚不清楚您的意思是哪种更新。代码没有以任何相关方式更改。如果这仍然需要,请澄清,我会尽量满足你。
  • 我的意思是我在 python 3.3 中尝试了你的简化方法,它没有给我任何错误,你能更新至少完整的方法吗,你正在做什么x = self.__kg('a')

标签: python class instance-variables function-parameter


【解决方案1】:

只要变量在类中有双下划线,Python 就会调用名称修改(参见Python documentation on classes)。使用双下划线几乎只是为了避免与子类发生名称冲突或使变量“真正私有”。 (有关更多样式建议,请参阅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)

【讨论】:

    【解决方案2】:

    不要使用双下划线,这会使 python 发挥一些作用并将类名附加到变量名(称为名称修饰)。只需使用单下划线而不是双下划线。

    【讨论】:

      猜你喜欢
      • 2019-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-06
      • 2020-09-30
      • 2022-06-27
      相关资源
      最近更新 更多