クラスのメソッドでは、オブジェクトのクラスではなくメソッドが定義されているクラスのsuper()を呼び出す必要があります。私は特にPython 2.xを気にしますが、3.xのソリューションは大歓迎です。このコードはどのクラスで定義されていますか?
あるクラスが別のクラスを継承し、未知の深さまでプロジェクト全体で使用できる一般的な定型文を作成したいと考えています。再帰エラーを避けるには、コードが定義されている現クラスの親クラスを呼び出す必要があります。self
オブジェクトの親ではありません。多くのメソッドが拡張されているので、現在のクラス名が参照される各モジュールにはいくつかの場所があり、各拡張メソッドは親クラスメソッドを呼び出すことができます。ここで
#!/usr/bin/env python
from inspect import stack
class Foo(object):
def __init__(self):
print "Foo.__init__()"
print "file: %s" % __file__
print "class: %s" % self.__class__.__name__
print "stack: %s" % stack()[0][3]
print
class Bar(Foo):
def __init__(self):
print "Bar.__init__()"
super(type(self), self).__init__()
class Baz(Bar):
pass
foo = Foo()
bar = Bar()
baz = Baz()
が結果です:
はここで失敗したデモです
Foo.__init__()
file: ./class.py
class: Foo
stack: __init__
Bar.__init__()
Foo.__init__()
file: ./class.py
class: Bar
stack: __init__
Bar.__init__()
Bar.__init__()
# snip several hundred lines
Bar.__init__()
Bar.__init__()
Traceback (most recent call last):
File "./class.py", line 24, in <module>
baz = Baz()
File "./class.py", line 16, in __init__
super(type(self), self).__init__()
# snip several hundred lines
File "./class.py", line 16, in __init__
super(type(self), self).__init__()
File "./class.py", line 16, in __init__
super(type(self), self).__init__()
RuntimeError: maximum recursion depth exceeded while calling a Python object
「未知の深さには、」悪いオブジェクト設計のように聞こえます。 –
@DisplayName:「未知の深さまで」とは、コードが時間とともに成長することを意味します。私の場合、コードはテストスイートであり、既存のテストから継承したいくつかのテストと、既存のメソッドをオーバーライドまたは拡張しています。さらに、各テストは、テストフレームワークから特定の方法で呼び出される半ダースの事前定義されたメソッドを持つことが期待されます。 –
...基本的に、2.xには__this_class__の代名詞はありません。 –