0

说我有这个代码:

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()

例如,如果我想调用FunctionAfrom InstanceStyleA,我需要这样输入:

InstanceStyleA().FunctionA()

如果我想从 调用FunctionAInstanceStyleB我需要这样输入:

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

为什么会这样?如果它们都是类的实例,为什么它们会受到不同的对待?

4

2 回答 2

2

在您的示例代码中,您实际上有三个类和一个对象,它们的名称都令人困惑:

  • ClassStyleA是一个,继承自object
  • ClassStyleB也是一个继承自的object
  • InstanceStyleA不是实例_ _,它也是一个,继承自ClassStyleA.
  • InstanceStyleB不是一个,它是的一个实例ClassStyleB

要从创建实例,请调用该类。所以, , ,都是实例。也是如此- 它是一个变量,您将使用创建的实例分配给它。ClassStyleA()ClassStyleB()InstanceStyleA()InstanceStyleBClassStyleB

由于InstanceStyleB(不带括号) 已经是(of ) 的实例ClassStyleB,而不是class,因此您不能调用它。这解释了你的第二个 TypeError.

类似地,您只能在 instance 上调用方法在类中定义的函数,在您的示例中是FunctionAand FunctionB)。这解释了你的第一个: (同样,没有括号),是一个class TypeErrorInstanceStyleA

(撇开迂腐不谈:从技术上讲,以上大部分内容完全是谎言,但为了讨论,假设 Python 在类和实例、函数和方法之间有明确的分离会更简单。)

于 2013-04-20T01:35:21.173 回答
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

我希望这可以消除差异。

于 2013-04-20T01:26:18.873 回答