在python中打印对象/实例名

2024-04-29 12:28:59 发布

您现在位置: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()

Tags: 对象字符串selfdefhpprintattack办法
3条回答

你得先给他们起名字。E、 g

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()

我在这里发布了一个完整的解决方案:

https://stackoverflow.com/a/49331683/7386061

它的工作没有参数。例如,你可以这样做:

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

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

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

enemy1 = badguy()
enemy2 = badguy()

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

out: hit
out: hit
out: enemy1 has 2 hp left
out: enemy2 has 4 hp left

更好的设计原则是不依赖对象的特定名称,如下所示:

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 Classes - Private Variables)或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.

相关问题 更多 >