0

エラーが発生する理由を誰かが説明できますか:

global name 'helloWorld' is not defined

以下を実行するとき:

class A:
    def helloWorld():
        print 'hello world'

class B(A):
    def displayHelloWorld(self):
        helloWorld()

class Main:
     def main:
        b = B()
        b.displayHelloWorld()

私は、クラス B が明らかにクラス A のメソッド「helloWorld」のコピーを持っている Java に慣れているため、このコードは main の実行時に正常に実行されます。ただし、これは、クラス B には「helloWorld」というメソッドがないと考えているようです。

4

3 に答える 3

6

helloWorld() の前に自分自身がありません。self キーワードは、これがインスタンス関数または変数であることを意味します。クラス B がクラス A を継承すると、クラス A のすべての関数はself.classAfunction()、クラス B に実装されているかのようにアクセスできるようになります。

class A():
    def helloWorld(self): # <= missing a self here too
        print 'hello world'

class B(A):
    def displayHelloWorld(self):
        self.helloWorld()

class Main():
     def main(self):
        b = B()
        b.displayHelloWorld()
于 2013-10-31T22:02:17.700 に答える
1

メソッドがそのクラスからのものであることを示す必要があります ( self.):

class B(A):
    def displayHelloWorld(self):
        self.helloWorld()

Python はこの点で Java とは異なります。Python ではこれを明示的に指定する必要がありますが、Java は暗黙的にも受け入れます。

于 2013-10-31T22:03:42.363 に答える
0

この例で使用されている python のバージョンはわかりませんが、構文は python3 のように見えます。print( python2.x のようなステートメントを除く)

これがpython3であるとしましょう

それhelloWorldはクラスのクラスメソッドでありA、クラス属性として呼び出す必要があります。この関数がクラスの名前空間にあるとすぐに、所有者クラスを使用してのみ、このクラスの外部にアクセスできます。

A.helloWorld()

また

B.helloWorld()

また

self.__class__.helloWorld()

この場合、self引数が渡され、関数が予期しないとすぐに失敗するため、バインドされたメソッドとして呼び出すことはできません。

helloWorldのメソッドでAあり、selfパラメーターが欠落している可能性があります

この場合、このメソッドは次のように呼び出すことができます。

self.helloWorld()

また

A.helloWorld(self)
于 2013-10-31T22:07:18.593 に答える