说我有这段代码:
class ClassStyleA(object):
def FunctionA(self):
print "This is Style A."
class ClassStyleB(object):
def FunctionA(self):
print "This is Style B."
class InstanceStyleA(ClassStyleA):
def FunctionB(self):
print "This is also Style A."
InstanceStyleB = ClassStyleB()
如果我想从FunctionA
拨打InstanceStyleA
,我需要输入以下内容:
InstanceStyleA().FunctionA()
如果我想从FunctionA
拨打InstanceStyleB
,我需要输入以下内容:
InstanceStyleB.FunctionA()
我需要在InstanceStyleA
之后添加一组括号以调用其中一个函数,否则我会收到此错误:
TypeError: unbound method FunctionA() must be called with InstanceStyleA instance as first argument (got nothing instead)
同样,如果我在调用其中一个函数时尝试在InstanceStyleB
之后添加括号,我会收到此错误:
TypeError: 'ClassStyleB' object is not callable
为什么会这样?如果它们都是一个类的实例,为什么它们会被区别对待?
答案 0 :(得分:3)
在您的示例代码中,您实际上有三个类和一个对象,所有这些都令人困惑地命名为:
ClassStyleA
是一个类,它继承自object
ClassStyleB
也是类,它继承自object
InstanceStyleA
不 实例 ,它也是类,继承自ClassStyleA
。InstanceStyleB
不 类,它是类ClassStyleB
的实例 要从类创建实例,您可以调用该类。因此,ClassStyleA()
,ClassStyleB()
,InstanceStyleA()
都是实例。 InstanceStyleB
也是如此 - 它是您为ClassStyleB
创建的实例分配的变量。
由于InstanceStyleB
(没有括号)已经是实例(ClassStyleB
),而不是类,因此无法调用它。这解释了您的第二个 TypeError
。
类似地,您只能在实例上调用方法(在类中定义的函数,在您的示例中为FunctionA
和FunctionB
) 。这解释了您第一个 TypeError
:InstanceStyleA
(再次,没有括号),是类。
(撇开一边:从技术上讲,上面的大部分内容都是谎言,但为了这个讨论,假装Python在类和实例,函数和方法之间有明确的分离是更简单的。)
答案 1 :(得分:1)
当您使用括号调用InstanceStyleA时,您将创建InstanceStyleA的实例...然后在该实例上调用成员函数。它基本上是简写:
obj = InstanceStyleA()
obj.FunctionA()
InstanceStyleB不是一个类,它被设置为ClassStyleB的一个实例,所以当你引用它时,不需要括号(或实例化一个对象)。
就像你写的那样:
ClassObject = ClassStyleB()
ClassObject.FunctionA()
TypeError 是因为对象不可调用。例如:
d = {} #d is a dictionary
d() #d used as a function has no meaning
我希望这可以消除差异。