hasattr 不断返回 False

ano*_*321 2 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)
Run Code Online (Sandbox Code Playgroud)

有人知道为什么我期望的print语句会返回吗?FalseTrue

jon*_*rpe 6

你有两个问题:

  1. 双下划线属性名称调用"name mangling",因此 eg__hp变为_Avatar__hp(参见例如继承的样式指南)。
  2. check_hasattr您检查的属性Avatar类别,而不是self实例

这会起作用:

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')
Run Code Online (Sandbox Code Playgroud)

然而,没有必要保护对这些属性的访问(如果有,你应该使用 a@property而不是 name mangling);参见例如Python name mangling

另请注意,Class.method(instance)可以重写为instance.method(). 但是,在这种情况下,最简单的方法是完全删除该方法并只调用hasattr(warrior, '_Avatar__hp').