首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >hasattr一直返回False

hasattr一直返回False
EN

Stack Overflow用户
提问于 2015-05-13 16:06:53
回答 2查看 1.6K关注 0票数 3
代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

发布于 2015-05-13 16:22:55

您有两个问题:

  1. 双下划线属性名称调用"name mangling",因此例如__hp将变为_Avatar__hp (参见例如the style guide on inheritance).
  2. In check_hasattr您在类Avatar上检查属性,而不是在实例self上检查属性。

这将会起作用:

代码语言:javascript
复制
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')

票数 7
EN

Stack Overflow用户

发布于 2015-05-13 16:17:24

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

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

我更改了您的代码,以简化和删除不太有意义的内容:

代码语言:javascript
复制
class Avatar:
    def __init__(self,HP=100):
        self._hp = HP

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30209102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档