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

问题描述:

我想知道是否有方法在python中将对象名称打印为字符串。例如,我希望能够说ENEMY1有2 hp左或ENEMY2有4 hp左。有没有办法做到这一点?\python中的打印对象/实例名称

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

可以,但你会发现,它更有意义,只是对'badguy'类'name'场。反映变量名称几乎总是一个坏主意。另外,如果你有一个巨大的敌人名单? – Ares

+2

对象没有唯一的名称。如果你做'newname = enemy1',那么这个对象的“名称”是什么? – BrenBarn

+0

大多数物体没有名称。变量有名称,但变量和对象之间没有一一对应的关系。 – user2357112

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

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

我看到这个问题没有把自己,名称。虽然我希望可以使用实际的变量名,所以没有冗余的制作对象名称,然后再用引号将其重命名。谢谢。 – netrate

+1

@netrate正如评论者指出的那样,没有“对象名称”这样的东西。 *变量*有一个名字,但是可以有很多变量指向同一个对象,那么您将如何决定使用哪一个? – smarx

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

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. 
+0

很好的答案,但我的眼睛流血'set_name(..)'。你可以使用'@ property'来代替吗? – SuperSaiyan

+0

@SuperSaiyan改变了它,我同意'@财产'是要走的路,根本没有包括在原来的答案。 – ospahiu