2016-07-26 98 views
3

我想知道是否有方法在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

回答

1

你必須先給他們的名字。例如。

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

4

一個更好的設計原則不依賴於對象的具體名稱,如下圖所示:

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