【问题标题】:hasattr keeps returning Falsehasattr 不断返回 False
【发布时间】:2015-07-24 09:40:28
【问题描述】:
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

【问题讨论】:

  • 如果我删除下划线,它仍然返回 False
  • 应该是hasattr(self, ...) - 然后'_Avatar__hp''hp'(取决于您如何设置实例)工作正常。另外,为什么使用Avatar.check_hasattr(warrior) 而不是warrior.check_hasattr()

标签: python hasattr


【解决方案1】:

您的代码不起作用,因为您正在检查类Avatar 是否具有属性__hp,它没有它,只有实例具有它,因为该属性是在__init__ 中定义的。换句话说,hasattr 应该在 selfavatar 对象上调用,而不是在 Avatar 类上调用。

此外,双下划线在 python 中具有特殊的含义,它会破坏名称,因此在无法直接访问的意义上是“私有的”。这意味着检查实例是否具有属性__hp 将不起作用(您应该改为检查_Avatar__hp

我更改了您的代码以简化并删除没有太大意义的内容:

class Avatar:
    def __init__(self,HP=100):
        self._hp = HP

>>> avatar = Avatar()
>>> hasattr(avatar, '_hp')
True

注意:如果您创建 Avatar avatar = Avatar() 的实例,您应该直接在对象 avatar.mymethod() 上调用方法,而不是 Avatar.mymethod(avatar)

【讨论】:

  • 投反对票没问题,但至少在投反对票时留言。
【解决方案2】:

你有两个问题:

  1. 双下划线属性名称调用 "name mangling",例如__hp 变为 _Avatar__hp(参见例如 the style guide on inheritance)。
  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')

但是,没有必要保护对这些属性的访问(如果有,您应该使用@property 而不是名称修改);参见例如Python name mangling

还要注意Class.method(instance) 可以重写为instance.method()。不过,在这种情况下,最简单的方法是完全删除该方法,然后调用 hasattr(warrior, '_Avatar__hp')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-24
    • 2021-02-13
    • 1970-01-01
    • 2022-12-16
    • 2012-05-30
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多