【问题标题】:TypeError: 'class' object is not callableTypeError:“类”对象不可调用
【发布时间】:2013-11-14 04:20:41
【问题描述】:

我有:

主脚本:

import music.umm

UMM = music.umm.UMM()
UMM.read_information()

模块脚本:

class UMM(object):
    
    def read_information(self):
        # ..some code
        UMM.login()

UMM = UMM()

使用此代码,我在运行主脚本时收到此错误:

TypeError: 'UMM' 对象不可调用

我该如何解决?

我从模块中删除了这一行:

UMM = UMM()

现在,主脚本运行功能模块,但如果脚本模块转到另一个功能,我得到这个错误:

TypeError: unbound 方法 login() 必须使用 UMM 实例调用 第一个参数(什么都没有)

【问题讨论】:

  • 建议不要用class等python语句命名变量、函数和类
  • 你为什么有UMM = UMM()?它用类的实例覆盖了你的类的名称UMM,所以当你在脚本中导入它时,你实际上是在导入instance(这是最后一行:@987654328 @) 而不是你的班级。
  • 现在,我该怎么办?
  • @Black_Ram 尽量详细。 “如果脚本模块转到另一个函数”是什么意思?哪个功能?如果我们不知道具体情况,我们只能猜测。您可以提交一个SSCCE,向我们展示您的代码部分之间的关​​系。

标签: python class module


【解决方案1】:

这就是我的做法:

# Module Code
class MyClass(object):
    def foo(self):
        print "Foo"


# Client Code
from MyClass import MyClass
inst = MyClass()
inst.foo()

【讨论】:

  • 这绝对是我遇到的麻烦。 Python 的做法与我使用的其他语言大不相同,当我看到“from MyClass import MyClass”时,它看起来很不对。
  • 我们不能只做“import MyClass”吗?
【解决方案2】:

SSCCE 可能看起来像

umm.py:

class UMM(object):
    def login(self):
        print("login()")

    def read_information(self):
        print("read_info() 1")
        UMM.login()
        print("read_info() 2")

主脚本:

import umm
umm = umm.UMM()
umm.read_information()

我没有测试它,但我想这会产生以下异常

TypeError: unbound method login() must be called with UMM instance as first argument (got nothing instead)

原因是UMM.login() 是一个期望通过对象实例调用的方法。

read_information() 内部,您有self 作为具体对象实例。所以你可以替换调用

UMM.login()

self.login()

为了满足所有依赖关系。

UMM.login() 的调用将尝试调用login(),而无需处理对象实例。这适用于 @staticmethod@classmethod,但不适用于常规绑定方法。

【讨论】:

  • 已解决。谢谢! :-)
【解决方案3】:

class 是定义类的保留关键字。

尝试为你的班级命名:

class YourClass(object):
    ..functions..

然后初始化它:

var_class = YourClass()

【讨论】:

  • 你不懂。例如,我写了“类”,实际上我的类名称不同。
  • 请告诉我们您的确切代码。如果您一概而论,我们不知道从哪里开始。
【解决方案4】:

您需要启动该类的一个实例。

你试图这样做:

UMM = UMM()

您可以通过执行以下操作来启动类的实例:

umm = UMM()

即不覆盖类名。

【讨论】:

    【解决方案5】:

    UMM 可能是模块类型而不是类对象。
    你可以通过做看到它

    print(music.umm.UMM)   # will output type module
    

    所以解决方案是用完整路径导入:

    from music.umm.UMM import UMM
    
    print(UMM)   # should output type class
    
    umm_class_instance = UMM()
    umm_class_instance.read_information()
    

    【讨论】:

      猜你喜欢
      • 2019-08-27
      • 1970-01-01
      • 1970-01-01
      • 2018-12-25
      • 2021-04-15
      • 2011-10-01
      • 2020-11-10
      • 2017-09-09
      • 2016-07-23
      相关资源
      最近更新 更多