我将一个函数作为参数传递给类构造函数。构造函数将它存储在实例变量中,其他类方法想要调用它。
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的Evaluate Expression窗口中评估函数调用时,我得到同样的东西。但是当我评估实例变量本身(“self .__ kg”)时,我得到:
result = {function} <function <lambda> at 0x0000000002ED5C18>
...因此似乎__kg 属性是定义的。
出了什么问题?
我可以通过引用参数调用该函数 - 没问题。
kg(a')
我也可以将参数的值赋给方法变量并调用变量 - 没问题。
_kag = kg
_kag('a')
它只是对实例变量的引用不起作用。
答案 0 :(得分:1)
每当一个变量在一个类中有一个双下划线时,Python就会调用名称修改(参见Python documentation on classes)。使用双下划线几乎只是为了避免与子类的名称冲突或使变量真正变为私有&#39;。 (有关更多样式建议,请参阅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)
答案 1 :(得分:1)
不要使用双下划线,这使得python做了一些魔法并将classname附加到变量名称(称为名称修改)。只需使用单个下划线而不是双倍。