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

如何调用Python类实例变量中存储的函数,python,class,instance-variables,function-parameter,Python,Class,Instance Variables,Function Parameter,我将函数作为参数传递给类构造函数。构造函数将其存储在实例变量中,其他类方法希望调用它 class ComboList(list) : def __init__(self,a,b,kg) : list.__init__(self) self.__kg = kg # More stuff follows 当我尝试用其他方法调用函数时,例如: x = self.__kg('a') 我得到“{AttributeError}”对象没有属性“\uu

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

class ComboList(list) :
    def __init__(self,a,b,kg) :
        list.__init__(self)
        self.__kg = kg
        # More stuff follows
当我尝试用其他方法调用函数时,例如:

x = self.__kg('a')
我得到“{AttributeError}”对象没有属性“\uu kg”

当我在IDE的“求值表达式”窗口中求值函数调用时,得到了相同的结果。但当我计算实例变量本身(“self._kg”)时,我得到:

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

kg(a')
_kag = kg
_kag('a')

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

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

如果希望其他继承的子类使用私有变量,可以使用一个下划线(
\u 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发挥一些魔力,并将类名附加到变量名(称为名称混乱)。只需使用单下划线而不是双下划线。

这是-尝试使用组合列表。或者干脆去掉双下划线。你能不能更新你正在创建
组合列表
对象并调用kg函数的代码?jonrsharpe,这很有道理,但令人惊讶。我知道名称混乱会使变量在定义它们的范围对象之外很难意外地获取。我没想到它会使scope对象中的目标难以实现@阿南德,不清楚你的意思是什么。代码没有任何相关的变化。如果这仍然是需要的,请澄清,我会尽力满足您的要求。我的意思是,我在python 3.3中尝试了您的简化方法,它没有给我任何错误,您能否至少更新完整的方法,您正在执行
x=self.\uu kg('a')
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)