在 python 中打印对象/实例名称

新手上路,请多包涵

我想知道是否有办法将 python 中的对象名称打印为字符串。例如,我希望能够说 ENEMY1 还剩下 2 hp,或者 ENEMY2 还剩下 4 hp。有办法吗?

 class badguy:
    def __init__(self):
        self.hp = 4

    def attack(self):
        print("hit")
        self.hp -= 1

    def still_alive(self):
        if self.hp <=0:
            print("enemy destroyed")
        else :
            print (str(self.hp) + " hp left")

    # creating objects

    enemy1 = badguy()
    enemy2 = badguy()

    enemy1.attack()
    enemy1.attack()
    enemy1.still_alive()
    enemy2.still_alive()

原文由 netrate 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 769
2 个回答

你必须先给他们起名字。例如

class badguy:
    def __init__(self, name):
        self.hp = 4
        self.name = name

    def attack(self):
        print("hit")
        self.hp -= 1

    def still_alive(self):
        if self.hp <=0:
            print("enemy destroyed")
        else :
            print (self.name + " has " + str(self.hp) + " hp left")

    # creating objects

    enemy1 = badguy('ENEMY1')
    enemy2 = badguy('ENEMY2')

    enemy1.attack()
    enemy1.attack()
    enemy1.still_alive()
    enemy2.still_alive()

原文由 user94559 发布,翻译遵循 CC BY-SA 3.0 许可协议

一个更好的 设计原则 是不依赖对象的具体名称,如下所示:

 class badguy(object):
    def __init__(self):
        pass

b = badguy()
print b
>>> <__main__.badguy object at 0x7f2089a74e50>  # Not a great name huh? :D

这可能会导致大量与赋值绑定、引用有关的 _问题_,最重要的是不允许您为每个 用户程序 选择的对象命名。

而是将一个实例变量添加到名为 self._name9.6 类 - 私有变量)或 self.name 的类中,如果你想允许类范围之外的访问( _在这个例子中,你可以随便命名_)。这不仅更加 面向对象的 设计,而且现在您可以实现类似 __hash__ 的方法,以便能够基于名称创建 哈希,例如使用对象作为键( 还有更多原因为什么这个设计选择更好! )。

 class badguy(object):
    def __init__(self, name=None):
        self.hp = 4
        self._name = name

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, name):
        self._name = name

    def attack(self):
        print("hit")
        self.hp -= 1

    def still_alive(self):
        if self.hp <=0:
            print("enemy destroyed")
        else :
            print ("{} has {} hp left.".format(self.name, self.hp))

示例输出:

 b = badguy('Enemy 1')
print b.name
>>> Enemy 1

b.still_alive()
>>> Enemy 1 has 4 hp left.

b.name = 'Enemy One'  # Changing our object's name.
b.still_alive()
>>> Enemy One has 4 hp left.

原文由 ospahiu 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题