Python“类没有属性”

新手上路,请多包涵

我是 Python 的新手,我正在学习类和函数,我想打印一个类的函数,但我得到的只是错误“类没有属性”

项目.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))

主要文件:

 from items import Item

print(Item.Gold.print_info)

错误是

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

原文由 username 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 499
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 模块

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

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题