1

次のような関数を持つクラスがあります。

def foo(self):
    do_stuff()

そして、私はそれを次のように呼びます:

instance.foo()

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

TypeError: foo() takes exactly 1 argument (0 given)

しかし、これはうまくいきます:

instance.foo(instance)

なぜこれが起こっているのか誰にも説明できますか?それは私を少し奇妙にしています

さらに情報が必要な場合は、お気軽にお問い合わせください

編集は、実際のコードの概算です...

def __new__(self):
    blah blah
    MyClass.__init__(self,blah)
    self.foo(self)     #<------------------------error here

私はどのように機能するかを誤解して__new__いると思います...私は今いくつかの読書をしています

4

2 に答える 2

3

ここでの問題は、new関数が self を引数として受け入れないことです。これは、新しいオブジェクトを作成しているためです。最初の引数は実際にはクラスであり、通常は cls と短縮されます。

ソース

修正されたサンプル:

def __new__(cls):
    blah blah
    obj = MyClass.__new__(MyClass)
    obj.foo()
    return obj

これにより、cls の代わりに MyClass のインスタンスが作成されます。MyClass が cls のサブクラスである場合、その init メソッドも自動的に呼び出されます (リンクされた参照を参照)

于 2013-01-28T11:52:09.603 に答える
0
class MyClass  
    def __new__(cls):
        blah
        o = object.__new__(cls)
        o.foo()
        return o

__new__インスタンスを返す必要があります。MyClassのインスタンスではなく、引数としてMyClassを取得します。

でインスタンス化するためMyClass__new__object.__new__が採用されています。これは、無限の再帰を防ぐためです

__init____new__この値がMyClass型である限り、の戻り値に対して自動的に呼び出されます。これは、メタクラスで遊ぶことで防ぐことができます

于 2013-01-28T13:44:18.107 に答える