2015-02-11 97 views
0

我是新來的Python和我學習類和功能,我想打印一類的功能,但我得到的是錯誤「類有沒有屬性」Python的「類有沒有屬性」

items.py:

class Item(): 
    def __init___(self, name, desc, val): 
     self.name = name 
     self.desc = desc 
     self.val = val 

    def print_info(self): 
     return '{}\n==========\n{}\n\nValue: {}'.format(self.name, self.desc, self.val) 

class Gold(Item): 
    def __init__(self): 
     super().__init__(name = "Gold", desc = "Golden coin.", val = str(5)) 

main.py:

from items import Item 

print(Item.Gold.print_info) 

的錯誤是

"AttributeError: type object 'Item' has no attribute 'Gold'" 
+0

這意味着類Item沒有方法也沒有變量名爲Gold ...即使它沒有... G舊有沒有名爲'print_info'的方法或變量 – 2015-02-11 18:26:34

+0

你爲什麼要調用'Item.Gold'? – 2015-02-11 18:27:49

+0

'Gold'不是'Item'的一個屬性,所以'Item.Gold'沒什麼意義。這是一個子類,它是一個完全不同的東西。你想達到什麼目的? – freakish 2015-02-11 18:29:13

回答

1

Gold不是Item類中的一個屬性,no。它是一個子類,本身就是一個全球名稱。您可以從items模塊導入:

>>> from items import Gold 
>>> Gold 
<class 'items.Gold'> 

不能創建它的一個實例,因爲對於Item.__init__方法用錯了名字:

>>> from items import Item 
>>> Item.__init__ 
<slot wrapper '__init__' of 'object' objects> 
>>> Item.__init___ 
<function Item.__init___ at 0x1067be510> 
>>> Item('a', 'b', 4) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: object() takes no parameters 

請注意,您所創建的方法有下劃線的名字。如果你解決這個問題:

class Item(): 
    def __init__(self, name, desc, val): 
     #^^2 underscores on both sides 
     self.name = name 
     self.desc = desc 
     self.val = val 

您可以創建Gold()類的實例:現在

>>> Gold() 
<items.Gold object at 0x1067cfb00> 
>>> gold = Gold() 
>>> print(gold.print_info()) 
Gold 
========== 
Golden coin. 

Value: 5 

,如果你真的想創造Item類屬性,你就必須添加這些後您創建的類:

class Item(): 
    def __init___(self, name, desc, val): 
     self.name = name 
     self.desc = desc 
     self.val = val 

    def print_info(self): 
     return '{}\n==========\n{}\n\nValue: {}'.format(self.name, self.desc, self.val) 

Item.gold = Item('Gold', 'Golden coin.', 5) 

ÿ你不需要爲此創建子類。您可以使用enum module雖然這裏:

from enum import Enum 

class Item(Enum): 
    Gold = 'Golden coin.', 5 
    Silver = 'Silver coin.', 1 

    def __init__(self, desc, val): 
     self.desc = desc 
     self.val = val 

    def print_info(self): 
     return '{}\n==========\n{}\n\nValue: {}'.format(self.name, self.desc, self.val) 

這裏GoldItem屬性:

>>> Item 
<enum 'Item'> 
>>> Item.Gold 
<Item.Gold: ('Golden coin.', 5)> 
>>> print(Item.Gold.print_info()) 
Gold 
========== 
Golden coin. 

Value: 5 
>>> Item.Silver 
<Item.Silver: ('Silver coin.', 1)> 
0

您可以調用在ItemGold類,但功能另一種方式。所以,你的主要應該是:

from items import Gold 
print(Gold.print_info) 

請注意,如果你不停止功能(),那麼你就只得到函數的字符串表示。但是,如果你在當前的代碼中這樣做,除非先創建對象然後調用print_info(),否則它將不起作用。

0

這裏是你做錯了什麼:

  • GoldItem一個子類,而不是它的一個屬性。當您嘗試執行Item.Gold時,您的錯誤會彈出。黃金是完全分開訪問的。
  • 您需要將您的類實例化爲對象。一旦你實例化一個對象,你可以調用你的方法並訪問它的屬性。每個對象獨立存儲方法和屬性,因此一個金幣可以具有不同的名稱,描述,值,甚至以不同的方式打印其信息。
  • 當試圖從子類內訪問父類時,只需直接引用類名稱,而不是使用super()
  • 您在有一個額外的下劃線您Item類的__init__()
考慮到這一點

所以,你的新main.py應該是這樣的:

from items import Gold 

mygold = Gold() # This is where we instantiate Gold into an object 
print(mygold.print_info()) # We call the method on the object itself 

而且你items.py看起來就像這樣:

class Item(): 
    def __init__(self, name, desc, val): 
     self.name = name 
     self.desc = desc 
     self.val = val 

    def print_info(self): 
     return '{}\n==========\n{}\n\nValue: {}'.format(self.name, self.desc, self.val) 

class Gold(Item): 
    def __init__(self): 
     Item.__init__(name = "Gold", desc = "Golden coin.", val = str(5)) 
+0

這是正確的,但我確實注意到作者確實使用了'super()'。如果這是需要的,那麼所有必須完成的事情是'Item'來繼承'object',即'class Item(object):' – 2015-02-11 18:50:32

相關問題