哈斯塔特不断地返回错误

2024-10-02 10:26:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: selfinitdefcheckmagicclasshphasattr
2条回答

你有两个问题:

  1. 双下划线属性名调用“name mangling”,因此,例如__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')。在

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

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

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

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

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

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

相关问题 更多 >

    热门问题