class Avatar:
def __init__(self, HP=100, damage=10, defends=10, magic=5):
self.__hp = HP
self.__dam = damage
self.__def = defends
self.__mag = magic
def check_hasattr(self):
print hasattr(Avatar,'__hp')
warrior = Avatar(99,9,9,4)
Avatar.check_hasattr(warrior)
有人知道为什么print
语句返回False
,而我期望True
?在
你有两个问题:
__hp
变成{check_hasattr
中,检查Avatar
,类的属性,而不是self
,实例。在这将起作用:
但是,不需要保护对这些属性的访问(如果有,您应该使用
@property
而不是名称混乱);请参见例如Python name mangling还要注意,
Class.method(instance)
可以重写为instance.method()
。不过,在这种情况下,最简单的方法是完全删除该方法,只调用hasattr(warrior, '_Avatar__hp')
。在您的代码无法工作,因为您正在检查类
Avatar
是否具有属性__hp
,但它没有该属性,只有实例具有该属性,因为该属性是在__init__
中定义的。换句话说,hasattr
应该在self
或avatar
对象上调用,而不是在Avatar
类上调用。在此外,双下划线在python中有一个特殊的含义,它会损坏名称,因此在不能直接访问的意义上是“private”。这意味着检查实例是否具有属性
__hp
将不起作用(应该改为检查_Avatar__hp
)我更改了您的代码,以简化和删除不太合理的内容:
注意:如果您创建Avatar}
avatar = Avatar()
的实例,您应该直接调用对象avatar.mymethod()
上的方法,而不是{相关问题 更多 >
编程相关推荐