我是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 :(得分:1)
Gold
不是Item
类的属性,不是。它是一个子类,本身就是一个全局名称。您可以从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)
此处Gold
属性为Item
:
>>> 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)>
答案 1 :(得分:0)
您可以通过Item
课程调用Gold
中的功能,但反之则不。所以你的主要应该是:
from items import Gold
print(Gold.print_info)
请注意,如果你不使用()结束函数,那么你将只获得函数的字符串表示。但是如果你在当前的代码中这样做,除非先创建对象,然后再调用print_info()
,否则它将无效。
答案 2 :(得分:0)
这是你做错了什么:
Gold
是Item
的子类,而不是它的属性。当您尝试执行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))