5

理由がわからないコードが機能します。私の理解ではうまくいかないはずです。問題を以下に簡単に示します。

「メイン.py」

from x import * #class x is defined
from y import * #class y is defined


xTypeObj = x()
yTypeObj = y()
yTypeObj.func(xTypeObj)

「x.py」

class x(object):

    def __init__...
        ...
    def functionThatReturnsAString(self):
        return "blah"

「y.py」

#NO IMPORT STATEMENT NEEDED?? WHY

class y(object):
    def __init__...
        ...
    def func(self, objOfTypeX):
        print(objOfTypeX.functionThatReturnsAString())

私の質問は、タイプの「y.py」にインポートステートメントを含める必要がないのはなぜですか

from x import functionThatReturnAString()

このメソッドを呼び出す方法をどのように理解しますか?

4

3 に答える 3

9

Python はオブジェクト指向のプログラミング言語です。そのような言語では、値はオブジェクトであり、オブジェクトはメソッドを持つことができます。

functionThatReturnsAString関数はクラスのメソッドであり、そのクラスobjOfTypeXインスタンスです。クラスのインスタンスは、そのクラスのすべてのメソッドを持ちます。

これが、たとえばlistPython のオブジェクトに.append()メソッドがある理由です。

>>> alist = []
>>> alist.append(1)
>>> alist
[1]

listクラスにはメソッドがあり、その.append()メソッドを呼び出すためにそのメソッドをインポートする必要はありません。必要なのは、リスト インスタンスへの参照だけです。

技術的に言えば、pythonlisttypeですが、ここではその区別は重要ではありません。全体として、この議論の目的上、型はクラスと同じものです。

Python チュートリアルを読んでください。後の章でクラスについて説明しています (ただし、最初の一連の章を最初にざっと目を通しておいたほうがよいかもしれません)。

于 2012-11-13T17:49:41.987 に答える
3

Python は動的型付け言語です。C++ や Java などの静的に型付けされた言語とは異なり、メソッドへの呼び出しは実際に実行されるまでバインドされないため、メソッドが定義されている場合にモジュールをインポートする必要がないのはなぜですか。これにはいくつかの意味があります。

  1. メソッド (およびデータ メンバー) は実行時にインスタンスに追加および削除できるため、クラス Foo の 2 つのインスタンスは、同じ型であっても実際には異なるメソッドを持つことができます。
  2. メソッド (およびデータ メンバー) は、実行時にクラスに追加および削除できます。これは、現在のすべてのインスタンスと新しいインスタンスに影響を与えます。
  3. 基本クラスは、実行時にクラスに追加および削除できます。

これは、動的型付け言語と静的型付け言語の違いをすべて網羅したリストではないことに注意してください。

于 2012-11-13T17:58:43.847 に答える
1

関数は、クラスがインポートされた場所yTypeObj.funcから呼び出されます。main.pyしたがって、オブジェクトを作成して、そのすべてのメソッド (functionThatReturnAStringは のメソッドobjOfTypeX) とともに関数に渡すことができます。

于 2012-11-13T17:47:25.673 に答える