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

たとえばFunctionA、 fromを呼び出したい場合は、次のInstanceStyleAように入力する必要があります。

InstanceStyleA().FunctionA()

FunctionAから呼び出したい場合はInstanceStyleB、次のように入力する必要があります。

InstanceStyleB.FunctionA()

関数の 1 つを呼び出すには、後に一連の括弧を追加する必要がありInstanceStyleAます。そうしないと、次のエラーが発生します。

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

同様に、InstanceStyleB関数の 1 つを呼び出すときにかっこを追加しようとすると、次のエラーが発生します。

TypeError: 'ClassStyleB' object is not callable

これはなぜですか?両方ともクラスのインスタンスである場合、なぜ扱いが異なるのでしょうか?

4

2 に答える 2

2

サンプル コードには、実際には 3 つのクラスと 1 つのオブジェクトがあり、すべて紛らわしい名前になっています。

  • ClassStyleAから継承するクラスですobject
  • ClassStyleBも継承するクラスです。object
  • InstanceStyleAインスタンスではありませから継承するクラスでもありClassStyleAます。
  • InstanceStyleBクラスではなくクラスインスタンスですClassStyleB

クラスからインスタンスを作成するには、クラスを呼び出します。したがって、、、ClassStyleA()ClassStyleB()すべてInstanceStyleA()インスタンスです。で作成したインスタンスを代入InstanceStyleBする変数ですClassStyleB

InstanceStyleB(括弧なし) は既に(の)インスタンスであり、 classではないため、呼び出すことはできません。これはあなたの2番目を説明しています。ClassStyleB TypeError

同様に、インスタンスでのみメソッド(クラスで定義された関数、例ではFunctionAand FunctionB)を呼び出すことができます。これはあなたの最初の: (再び、括弧なし) を説明しています, is a 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 に答える