Python“类没有属性”

时间:2015-02-11 18:25:14

标签: python class

我是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'"

3 个答案:

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

这是你做错了什么:

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