调用类函数的不同方法

时间:2013-04-20 01:13:49

标签: python

说我有这段代码:

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

为什么会这样?如果它们都是一个类的实例,为什么它们会被区别对待?

2 个答案:

答案 0 :(得分:3)

在您的示例代码中,您实际上有三个类和一个对象,所有这些都令人困惑地命名为:

  • ClassStyleA是一个,它继承自object
  • ClassStyleB也是,它继承自object
  • InstanceStyleA 实例 ,它也是,继承自ClassStyleA
  • InstanceStyleB ,它是类ClassStyleB实例

要从创建实例,您可以调用该类。因此,ClassStyleA()ClassStyleB()InstanceStyleA()都是实例InstanceStyleB也是如此 - 它是您为ClassStyleB创建的实例分配的变量。

由于InstanceStyleB(没有括号)已经是实例ClassStyleB),而不是,因此无法调用它。这解释了您的第二个 TypeError

类似地,您只能在实例上调用方法(在类中定义的函数,在您的示例中为FunctionAFunctionB) 。这解释了您第一个 TypeErrorInstanceStyleA(再次,没有括号),是

(撇开一边:从技术上讲,上面的大部分内容都是谎言,但为了这个讨论,假装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

我希望这可以消除差异。