【问题标题】:Attribute Error creating Classes with Python使用 Python 创建类的属性错误
【发布时间】:2021-05-03 07:40:06
【问题描述】:

我不熟悉创建课程并尝试解决问题/练习。

当我尝试实例化工具箱时,我会尝试向其中添加一些工具。我的方法是将它创建为一个列表,并向其中添加新元素。它返回一个“None”类型属性,我不知道如何修复它。

class Toolbox:
    def __init__(self):
        self.toolbox = []
    def add_tool(self, tool):
        self.toolbox.append(tool)
    def remove_tool(self, tool):
        self.toolbox.remove(tool)

class Hammers:
    color = ""
    def __init__(self, color=''):
        pass
    def hammer_in(self, nail):
        pass
    def remove(self, nail):
        pass
    def paint(self, color):
        pass

class Screwdrivers:
    size = 10
    def __init__(self, size=''):
        pass
    def tighten(self, screw):
        pass
    def loosen(self, screw):
        pass



toolbox = Toolbox()
hammer = Hammers()
screwdriver = Screwdrivers()

toolbox = toolbox.add_tool(hammer)
toolbox = toolbox.add_tool(screwdriver)


输出:

Traceback (most recent call last):
  File "C:Create Classes.py", line 133, in <module>
    toolbox = toolbox.add_tool(screwdriver)
AttributeError: 'NoneType' object has no attribute 'add_tool'

我正在尝试: 实例化一个工具箱、一把螺丝刀和一把锤子。

Put the hammer and screwdriver in the toolbox.

谢谢,

【问题讨论】:

  • toolbox.add_tool 返回None。您将其分配给toolbox。因此,当您再次尝试执行 toolbox.add_tool 时会出现错误。只是不要分配给toolbox

标签: python class


【解决方案1】:

正如 Arseniy 所说,您的问题来自将工具箱重新分配给新对象:

首先,将一个 Toolbox 对象分配给toolbox 引用

toolbox = Toolbox()

然后,toolbox.add_tool 的结果,即对象None 被分配给toolbox 引用,因此toolbox 现在不再指向实例化的Toolbox 对象:

toolbox = toolbox.add_tool(hammer) 

因此,您应该做的只是删除重新分配:

toolbox.add_tool(hammer)
toolbox.add_tool(screwdriver)

这应该会导致:

>>> print (toolbox.toolbox)
[<__main__.Hammers object at 0x...>, <__main__.Screwdrivers object at 0x...>]

【讨论】:

  • 谢谢!这么快的问题 - 为什么它返回None?而且我不明白结果......为什么它不只是一个简单的列表?
  • 嗨@m3.b。这里的问题来自 Python 内部的工作方式。在 Python 中,所有内容都作为object 处理(包括非实例化的classes)。因此,当您对变量进行引用分配时,您所做的就是为其分配一个对象。因此,该分配必须始终是可能的。但是当你没有在变量赋值中赋值时会发生什么?好吧,事实上该变量将引用对象None。由于方法toolbox.add_tool(hammer)没有任何返回值,将其分配给工具箱将使工具箱引用对象None
  • 嗨@esocrats。感谢您的评论。但是,add.tool() 方法具有附加元素的功能……不是吗?为什么它什么都不返回?或者我应该写return self.toolbox.append()而不是?
  • 确实,只要你不写return [object]([object] 是你要返回的对象的占位符)你的方法就会返回None。查看 Python Typing 模块可能对您有用。向你的函数添加类型提示,将帮助你跟踪 Python 正在(或应该)在做什么。
  • 谢谢。如果我打电话给&gt;&gt;&gt; toolbox = Toolbox() &gt;&gt;&gt; toolbox &lt;__main__.Toolbox object at 0x0000025831C3DF70&gt; 。我不明白这一行:为什么此时它没有向我显示一个空列表?
【解决方案2】:

add_tool 什么都不返回(None),你把它分配给工具箱

toolbox = toolbox.add_tool(hammer)  <--- problem here 
toolbox = toolbox.add_tool(screwdriver)

所以,toolbox 变成 None 和 'NoneType' object has no attribute 'add_tool'

【讨论】:

    【解决方案3】:

    add_toolremove_tool 隐式返回 None。您不应将此返回值分配给toolbox

    您错误地使用了类属性。 color 应该是一个实例属性。 size 的默认值是错误的,因为 size 不是空字符串。

    Hammers 类代表一个Hammer。为什么你可以用锤子画画?

    class Toolbox:
        def __init__(self):
            self.toolbox = []
        def add_tool(self, tool):
            self.toolbox.append(tool)
        def remove_tool(self, tool):
            self.toolbox.remove(tool)
    
    class Hammer:
        def __init__(self, color=''):
            self.color = color
        def hammer_in(self, nail):
            pass
        def remove(self, nail):
            pass
        def paint(self, color):
            pass
    
    class Screwdriver:
        def __init__(self, size=10):
            self.size = size
        def tighten(self, screw):
            pass
        def loosen(self, screw):
            pass
    
    
    toolbox = Toolbox()
    hammer = Hammer()
    screwdriver = Screwdriver()
    toolbox.add_tool(hammer)
    toolbox.add_tool(screwdriver)
    

    【讨论】:

      猜你喜欢
      • 2014-09-23
      • 2022-11-13
      • 2023-04-06
      • 2023-03-03
      • 1970-01-01
      • 2011-07-25
      • 2018-02-27
      • 2022-10-18
      • 1970-01-01
      相关资源
      最近更新 更多