在類中的方法中,我需要調用定義該方法的類的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
「一個未知的深度」聽起來像一個壞對象設計。 – 2016-04-28 15:06:49
@DisplayName:「未知深度」意味着代碼會隨着時間的推移而增長。就我而言,代碼是一個測試套件,其中一些測試從現有測試繼承,並覆蓋或擴展現有方法。此外,每個測試預計會有六個預定義的方法,這些方法是從測試框架以特定方式調用的。 –
...基本上,2.x沒有__this_class__的代詞。 –