3

さて、これに出くわしたとき、私はいくつかの情報源を調べていました:

>>> def __parse(self, filename):
...         "parse ID3v1.0 tags from MP3 file"
...         self.clear()
...         try:
...             fsock = open(filename, "rb", 0)
...             try:
...                 fsock.seek(-128, 2)
...                 tagdata = fsock.read(128)
...             finally:
...                 fsock.close()
...             if tagdata[:3] == 'TAG':
...                 for tag, (start, end, parseFunc) in self.tagDataMap.items():
...                     self[tag] = parseFunc(tagdata[start:end])
...         except IOError:
...             pass
... 

それで、私はそれをテストすることにしました。

 >>> __parse("blah.mp3")

そして、私はこのエラーを受け取りました:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __parse() takes exactly 2 arguments (1 given)

これに遭遇したのはこれが初めてではなく、引数パラメータリストに自分自身を含めることを意図していると思い続けていますが、それは正しくないことを知っています。誰かが私が遊んでみようとしているコードでこれがよく起こる理由を説明してもらえますか?それは用語についての私のレベルの理解のためだと思います、私はinitまたはselfが何をするのか、またはなぜそれが関連するのかさえほとんど理解していません。def x(b):printbはdefx(self、b)と同じです:self.b = b print self.bではありませんか?なぜそんなに重要なのですか!

基本的な説明が欲しいので、これを頭から離れることができます、ありがとう。

4

5 に答える 5

8

def __parseクラス定義の中にありました。

クラス定義からメソッドdefを引き出すことはできません。メソッド関数の定義はクラスの一部です。

これらの2つの例を見てください。

def add( a, b ):
    return a + b

class Adder( object ):
    def __init__( self ):
        self.grand_total = 0
    def add( self, a, b ):
        self.grand_total += a+b
        return a+b

ノート。

  1. 関数はを使用しませんself

  2. クラスメソッドはを使用しますselfself一般に、他に言うような特定のデコレータがない限り、すべてのインスタンスメソッドはを使用@classmethodします。

  3. 関数は他のものに依存しません。

  4. クラスメソッドは、クラスのインスタンスによって呼び出されることに依存しますAdder。さらに、それはクラスのそのインスタンスがAdder正しく初期化されているかどうかに依存します。この場合、初期化関数( )は、の各インスタンスが常にという名前のインスタンス変数を持ち、そのインスタンス変数の初期値が。で__init__あることを保証しています。Addergrand_total0

  5. addメソッド関数をAdderクラスから引き出して、個別に使用することはできません。スタンドアロン機能ではありません。それはクラス内で定義されており、クラスのその場所のために一定の期待があります。

于 2009-03-23T18:23:11.220 に答える
2

関数/メソッドは、クラスの外で記述してから、monkeypatchingと呼ばれる Python の手法に使用できます。

class C(object):
  def __init__(self):
    self.foo = 'bar'

def __output(self):
  print self.foo

C.output = __output
c = C()
c.output()
于 2009-03-23T18:32:44.380 に答える
0

selfは、クラスのinstancemethodラッパーによって自動的に渡されます。この関数はラップされていません。それはメソッドではなく、単なる関数です。自己パラメータが必要なため、クラスにアタッチしないと意味がありません。

于 2009-03-23T18:23:45.383 に答える
0

余談ですが、Python でクラスの静的メソッドを作成することは可能です。これを行う最も簡単な方法は、デコレータ (例: @staticmethod) を使用することです。ただし、この種のことは通常、Pythonic ソリューションではないと思います。

于 2009-03-23T18:29:22.767 に答える