0

これは比較的単純なはずですが、何かが足りないだけです。クラスに含まれる別のモジュールの関数を利用しようとしています。クラスが関係ないときは簡単にできます。

# a.py
import b

b.name()

--

# b.py
def name():
    print "What is your name?"

class details(object):

    def age():
        print "What is your age?"

ai を実行すると、期待される結果が得られます

名前は何?

ただし、別のモジュールから「def age()」にアクセスしようとすると、問題が発生し続けます。

これまでに試したことのいくつか...

# c.py
import b

b.details.age()

= TypeError: バインドされていないメソッド age() は、details インスタンスを最初の引数として呼び出す必要があります (代わりに何も取得しません)

# c.py
from b import details

details.age()

= TypeError: バインドされていないメソッド age() は、details インスタンスを最初の引数として呼び出す必要があります (代わりに何も取得しません)

# c.py
from b import details

b.details(age)

= NameError: 名前 'b' が定義されていません

他にもいくつか試しましたが、多すぎて合理的に投稿できません。私は何を間違っていますか?これを行うための構文は何ですか? 別のモジュールのクラス内に含まれている関数を実行することさえ可能ですか?

前もって感謝します

EDIT: Mike Grahamが提案したように、すべてのタブをスペースに修正しました

4

1 に答える 1

1

Python のすべてのクラス メソッドの最初のパラメーターは、現在のオブジェクトへの参照です (通常、これは self と呼ばれます)。ただし、インスタンスメソッドとしてではなく静的メソッドとして使用しようとしているように見えるのでデコレータを使用するつもりだった可能性があります。@staticmethod

class Details: # class names in Python should generally be CamelCased.
   # please note the comments below
   @staticmethod
   def age():
       print 'What is your age?' 

または、本当にインスタンス メソッドにしたい場合は、self参照方法を追加して変更する必要があります。

class Details:
   def age(self):
       print 'What is your age?' 

# c.py
from b import Details
#you must create an instance of the class before you can call methods on it.
d = Details() 
d.age()

編集

コメントで指摘されているように@staticmethod、真のユースケースがあることはまれです (たとえば、コードをモジュールで編成する方がよい場合がよくあります)。@classmethodあなたはしばしば代替手段として出くわします。@classmethodただし、 で装飾されたメソッドには、最初のパラメーターとして現在のクラスへの参照があることに注意してください。この質問では、主な違いについて説明します。

于 2013-04-29T17:20:11.863 に答える