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
吗?
答案 0 :(得分:3)
你有两个问题:
__hp
变为_Avatar__hp
(请参阅例如the style guide on inheritance)。check_hasattr
中,您检查Avatar
上的属性,类,而不是self
,实例。< / LI>
醇>
这样可行:
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(self, '_Avatar__hp')
但是,没有必要保护对这些属性的访问(如果有的话,你应该使用@property
而不是名称修改);见例如Python name mangling
另请注意,Class.method(instance)
可以重写为instance.method()
。但在这种情况下,最简单的方法是完全删除方法,只需调用hasattr(warrior, '_Avatar__hp')
。
答案 1 :(得分:-1)
您的代码无效,因为您正在检查类Avatar
是否具有属性__hp
,它没有它,只有实例拥有它,因为该属性在{{1}中定义}}。换句话说,__init__
应在hasattr
或self
对象上调用,而不是avatar
类。
此外,双下划线在python中具有特殊含义,它会破坏名称,因此在无法直接访问的意义上是“私有”。这意味着检查实例是否具有属性Avatar
将不起作用(您应该检查__hp
)
我更改了你的代码以简化和删除那些没有多大意义的东西:
_Avatar__hp
注意:如果您创建了头像class Avatar:
def __init__(self,HP=100):
self._hp = HP
>>> avatar = Avatar()
>>> hasattr(avatar, '_hp')
True
的实例,则应直接在对象avatar = Avatar()
上调用方法,而不是avatar.mymethod()