hasattr一直返回False

时间:2015-05-13 08:06:53

标签: python hasattr

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吗?

2 个答案:

答案 0 :(得分:3)

你有两个问题:

  1. 双下划线属性名称调用“name mangling”,例如__hp变为_Avatar__hp(请参阅例如the style guide on inheritance)。
  2. 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__应在hasattrself对象上调用,而不是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()