gpt4 book ai didi

python - 没有参数的 Python 2.x 中的 super()

转载 作者:太空狗 更新时间:2023-10-30 00:15:36 26 4
gpt4 key购买 nike

尝试将 super(B, self).method() 转换为一个简单的漂亮的 bubble() 调用。做到了see below !

在这个例子中是否可以获得对类 B 的引用?

class A(object): pass

class B(A):
def test(self):
test2()

class C(B): pass

import inspect
def test2():
frame = inspect.currentframe().f_back
cls = frame.[?something here?]
# cls here should == B (class)

c = C()
c.test()

基本上,CB 的 child ,BA 的 child 。然后我们创建 C 类型的 c。然后对 c.test() 的调用实际上调用了 B.test()(通过继承),它调用了 test2()

test2()可以得到父框架frame;通过 frame.f_code 对方法的代码引用; self 通过 frame.f_locals['self'];但是 type(frame.f_locals['self'])C(当然),但不是 B,其中定义了方法。

有什么方法可以得到B

最佳答案

从下面找到了一种更短的方法来执行 super(B, self).test() -> bubble()

(适用于多重继承,不需要参数,可正确处理子类)

解决方案是使用 inspect.getmro(type(back_self))(其中 back_self 是来自被调用方的 self),然后迭代它作为 cls with method_name in cls.__dict__ 并验证我们拥有的代码引用是此类中的代码引用(在 find_class_by_code_object(self) 嵌套函数)。

bubble() 可以使用 *args, **kwargs 轻松扩展。

import inspect
def bubble(*args, **kwargs):
def find_class_by_code_object(back_self, method_name, code):
for cls in inspect.getmro(type(back_self)):
if method_name in cls.__dict__:
method_fun = getattr(cls, method_name)
if method_fun.im_func.func_code is code:
return cls

frame = inspect.currentframe().f_back
back_self = frame.f_locals['self']
method_name = frame.f_code.co_name

for _ in xrange(5):
code = frame.f_code
cls = find_class_by_code_object(back_self, method_name, code)
if cls:
super_ = super(cls, back_self)
return getattr(super_, method_name)(*args, **kwargs)
try:
frame = frame.f_back
except:
return



class A(object):
def test(self):
print "A.test()"

class B(A):
def test(self):
# instead of "super(B, self).test()" we can do
bubble()

class C(B):
pass

c = C()
c.test() # works!

b = B()
b.test() # works!

如果有人有更好的主意,让我们听听。

已知错误:(感谢 doublep)如果 C.test = B.test --> “无限”递归。虽然子类实际上拥有一个方法似乎不现实,但该方法是从父类的=中提取的。

已知错误 2:(感谢 doublep)装饰方法将不起作用(可能无法修复,因为装饰器返回闭包)... 修复了 的装饰器问题for _ in xrange(5): ... frame = frame.f_back - 将处理最多 5 个装饰器,如果需要可以增加。 我喜欢 Python!

性能比 super() 调用差 5 倍,但我们谈论的是每秒 20 万次调用与每秒 100 万次调用,如果这不是在您最紧密的循环中 - 没有理由担心。

关于python - 没有参数的 Python 2.x 中的 super(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2706623/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com