【问题标题】:Getting an AttributeError: <class> has no attribute <method>获取 AttributeError: <class> 没有属性 <method>
【发布时间】:2012-10-17 04:17:24
【问题描述】:

我正在模块 mod1 的类中创建一个方法,并按如下方式调用它:

class blahblah:
   def foobar(self, bvar, **dvar)
       ////
       return dvar

并将其称为:

obj1 = mod1.blahblah()
dvar1 = obj1.foobar(True, **somedictionary)

它会抛出一个Attribute error: blahblah has no attribute named foobar

你能帮我吗?提前致谢

【问题讨论】:

  • 显然,无论出于何种原因,您都没有发布您实际使用的代码。没关系。但根据你的帖子,没有错。您确定您的真实代码中没有拼写错误(也许您不小心将foobar 拼成了fubar 等)?
  • 只有当foobar 不是blahblah 中定义的方法时才会发生此错误。由于您断言它是这样定义的,因此您不应该看到此错误。您确定foobar 在您的真实代码中定义在blahblah 内吗?
  • 您是否定义了两次blahblah?一次定义了foobar,一次没有? (即覆盖您之前的定义)
  • @user1778309 请贴出真实代码的相关摘录。
  • 你假设是真的,实际上是假的。看看dir(mod1.blahblah)(是foobar吗?),dir(obj1)(是foobar吗?),obj1.__class__(是mod1.blahblah?),obj1.__module__(是mod1吗?等。

标签: python attributeerror


【解决方案1】:

您描述的错误类型可能只是由于缩进不匹配引起的。如果方法位于类的最底部,将其在类中向上移动一点,问题就会变得明显。

当 python 解释器遇到不匹配的缩进时(比如你开始在文件底部使用空格缩进的制表符),解释器不会总是抛出错误;它可以简单地忽略文件的其余部分。我今天在更新一些旧代码时遇到了这个问题,其中原作者使用了不同的空白字符(恰好与我的 Geany 选项卡匹配),它让我陷入循环的时间比我想承认的要长得多。 :)

【讨论】:

  • 谢谢,这很有帮助。我遇到了同样的问题,在文件中使用了制表符和空格的混合缩进。在找到您的答案之前,我已经阅读了许多解释,但没有任何解决方案。
  • 不管怎样,在 jupyter notebook 中使用 %autoreload 魔术命令时,当您修改模块代码中的某些方法时,也会发生这种情况 (ipython.org/ipython-doc/3/config/extensions/…)
  • 这很有帮助!缩进也是我的问题。
【解决方案2】:

我遇到了同样的问题,对我来说,它发生在我移动类文件时,但我在旧文件夹中留下了一个 .pyo 文件,python 仍在读取该 .pyo 文件而不是读取移动的 .py 文件.

【讨论】:

    【解决方案3】:

    非常老的问题,但我引用 @Jacquot 的评论,因为它解决了我的问题(我在 ipython 中使用 %autoreload)。

    For what it's worth, it can also happen when using the %autoreload magic command in jupyter notebook, when you modify some methods in your module code (ipython.org/ipython-doc/3/config/extensions/…)

    特别是,我解决了重新运行正在导入我的类的单元的问题。

    【讨论】:

      【解决方案4】:

      遇到同样的问题,直到我意识到我用相同的名称命名了两个文件中的类 - 非常愚蠢!

      【讨论】:

      • 你确定这是问题的问题吗?
      • 我没有遇到同样的问题 - 但也没有找到解决方案。发布这个,如果其他人偶然发现“我的”问题 - 他们会在同一个地方找到解决方案。
      • 这正是我所做的——值得一提的是,当你重新定义一个类时,Python 不会出错。谢谢。
      【解决方案5】:

      老问题,但对于那些面临这个问题并且没有其他答案可以帮助你的人,这可能会有所帮助。我正在使用 Pickle 来保存一个包含一些数据的整个类,然后再次加载这个类实例,但是我在 init 上添加了一些类方法和属性,这就是解释器在我的类中找不到描述的新属性的原因(它在 pickle 对象中加载“旧”类)

      【讨论】:

      • 这原来是我的问题。对我腌制的东西和时间没有给予足够的关注。
      【解决方案6】:

      当我遇到这个问题时,我立即开始检查不平衡的缩进、制表符等……一切似乎都正确,但错误仍然出现。我走开,回来,又看了看,DUH...,我发现我有一个错字。我输入的是__inti__(),而不是__init__()。所以首先检查所有构造函数的语法。

      【讨论】:

        【解决方案7】:

        就我而言,我只是将 ClassName 添加到方法调用中,它就开始工作了:

        错误:

        import Clases.Class_filename as LWD
        articles=LWD.method_name(parameters)
        

        更正:

        import Clases.ClassName as LWD
        articles=LWD.ClassName.method_name(parameters)
        

        Classes/Class_filename.py 包含类似这样的内容:

        class ClassName :
            def method_name(parameters):
             ....
        

        【讨论】:

          【解决方案8】:

          对于使用 VSCode 的 Jupyter 笔记本,对我有用的是在更改导入的文件后重新启动 VSCode。

          【讨论】:

            猜你喜欢
            • 2016-11-18
            • 2018-03-13
            • 2020-03-09
            • 1970-01-01
            • 2019-06-03
            • 2015-02-17
            • 2020-12-18
            • 2013-11-06
            • 2021-03-17
            相关资源
            最近更新 更多