首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python“类没有属性”

Python“类没有属性”
EN

Stack Overflow用户
提问于 2015-02-11 18:25:13
回答 2查看 27.1K关注 0票数 0

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

items.py:

代码语言:javascript
复制
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:

代码语言:javascript
复制
from items import Item

print(Item.Gold.print_info)

错误是

代码语言:javascript
复制
"AttributeError: type object 'Item' has no attribute 'Gold'"
EN

回答 2

Stack Overflow用户

发布于 2015-02-11 18:36:19

Gold不是Item类的属性,不是。它本身就是一个子类,也是一个全局名称。您可以从您的items模块导入它:

代码语言:javascript
复制
>>> from items import Gold
>>> Gold
<class 'items.Gold'>

您不能创建它的实例,因为对Item.__init__方法使用了错误的名称:

代码语言:javascript
复制
>>> 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

请注意,您创建的方法的名称中有三个下划线。如果你修好了:

代码语言:javascript
复制
class Item():
    def __init__(self, name, desc, val):
        # ^   ^ 2 underscores on both sides
        self.name   = name
        self.desc   = desc
        self.val    = val

您可以创建Gold()类的实例:

代码语言:javascript
复制
>>> Gold()
<items.Gold object at 0x1067cfb00>
>>> gold = Gold()
>>> print(gold.print_info())
Gold
==========
Golden coin.

Value: 5

现在,如果您真的想在Item类上创建属性,那么您必须在创建该类之后添加这些属性:

代码语言:javascript
复制
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)

您不需要为此创建子类。不过,您可以在这里使用 module

代码语言:javascript
复制
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的一个属性

代码语言:javascript
复制
>>> 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)>
票数 2
EN

Stack Overflow用户

发布于 2015-02-11 18:39:50

以下是你做错的事:

  • GoldItem的子类,而不是它的一个属性。当您尝试执行Item.Gold时,会出现错误。黄金是完全分开获取的。
  • 您需要将类实例化为对象。一旦实例化了一个对象,就可以调用它上的方法并访问它的属性。每个对象都独立地存储方法和属性,因此一枚金币可以有不同的名称、描述、价值,甚至可以以不同的方式打印其信息。
  • 尝试从子类中访问父类时,只需直接引用类名,而不是使用super()
  • Item类的__init__()中有一个额外的下划线

因此,考虑到这一点,您的新main.py应该如下所示:

代码语言:javascript
复制
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会是这样的:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28461632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档