📜  是不可调用的. (1)

📅  最后修改于: 2023-12-03 15:10:29.763000             🧑  作者: Mango

TypeError: 'xxx' is not callable

当你在 Python 编程中看到这个错误信息时,通常代表着你正在尝试调用一个不可调用的对象。这个错误消息的原因可能是多样的,例如你正在尝试调用一个整数、字符串等不可调用的类型,或者是你想要调用的对象名和你想要调用的方法名混淆了。

下面是几种可能导致该错误信息的场景和解决方案:

场景一:尝试调用一个整数或字符串

如果你尝试调用一个整数或字符串,你会看到这样的错误信息:

x = 10
x()
# TypeError: 'int' object is not callable

这个错误信息告诉我们,整数类型是不可调用的。同样的,如果你尝试调用一个字符串,你也会看到类似的错误信息:

s = 'hello'
s()
# TypeError: 'str' object is not callable

解决方案:请确保你要调用的对象是可调用的,例如函数或方法。

场景二:对象名和方法名混淆

如果你想要调用一个对象的方法,但是却用对象名来调用,你会看到这样的错误信息:

class Student:
    def study(self):
        print('student is studying')

s = Student
s.study()
# TypeError: study() missing 1 required positional argument: 'self'

这个错误信息告诉我们,我们需要将对象实例化,并指定给一个变量。这里,我们使用了类名来访问类的方法,而不是使用该类的实例。因此我们需要将 Student() 赋值给变量 s。

解决方案:请确保你使用对象实例,而不是对象本身,并且确保你正在调用该对象的方法而不是其他东西。

场景三:对象不可调用

如果你正在尝试调用一个对象,但它本身不是可调用的,你会看到这样的错误信息:

class Human:
    def __init__(self, name, age):
        self.name = name
        self.age = age

h = Human('Sam', 20)
h()
# TypeError: 'Human' object is not callable

这个错误信息告诉我们,我们正在尝试调用一个并不是可调用的对象。在这个例子中,我们将 h 实例化为 Human 类的对象,但是 Human 类本身不是一个可调用的对象。

解决方案:请确保你使用可调用的对象。如果你要将普通的对象变成可调用的,你可以实现 __call__ 方法,这个方法允许你将对象变成可调用的。

class Human:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __call__(self):
        print(f'{self.name} is {self.age} years old.')

h = Human('Sam', 20)
h()
# Sam is 20 years old.

在这里,我们定义了一个 __call__ 方法,并用它将普通对象转变成可调用的。当我们调用这个对象时,它会打印出该对象的属性信息。

总结:TypeError: 'xxx' is not callable 代表着你正在尝试调用一个不可调用的对象。请确保你要调用的对象是可调用的,例如函数或方法,并且确保你正在调用该对象的方法而不是其他东西。如果你要将普通的对象变成可调用的,你可以实现 __call__ 方法。