gpt4 book ai didi

python - 在 Python 2.6+ 中使用 super(...) 时如何避免样板代码?

转载 作者:太空狗 更新时间:2023-10-30 01:16:39 26 4
gpt4 key购买 nike

是否有好的(适合在实际项目中使用)方法或减少这样的样板

class B(A):
def qqq(self): # 1 unwanted token "self"
super(B, self).qqq() # 7 unwanted tokens plus 2 duplications ("B", "qqq")
do_something()

我希望它看起来更像这样:

class B(A):
def qqq:
super
do_something()

或(更现实地)

class B(A):
@autosuper_before
def qqq(self):
do_something()

在 Python 2.6+ 中没有明显的黑客攻击是否可能?

@link super() in Python 2.x without args

最佳答案

tl;dr

正如 OP 所说“在 Python 2.6+ 中没有明显的黑客攻击是否可能?”,答案是:

长版

您可以制作一个简单的装饰器,它将使用此方法调用下一个父级。问题是您无法控制要传递的参数。

编辑:这对已经使用 autosuper 的子类不起作用,因为它会选择错误的类并进行无限循环。

def autosuper(fn):
def f(self, *args, **kw):
cl = super(type(self), self)
getattr(cl, fn.__name__)(*args, **kw)
return fn(self, *args, **kw)
return f

这是怎么做到的? Python 3.x 确实有一个不带参数的 super 函数!

不幸的是,Python 3.x 的 super 是一个,同时也是一个关键字,因为只有它的名字存在将更改当前环境以显示名为 __class__ 的变量,这是您需要使用的正确类!

如果检查类中声明的函数内的框架,则没有 __class__ 变量和框架的 f_code 属性的 co_freevars 属性是空的。当您编写名称 super(不需要调用它)时,__class__ 字符串将出现在 co_freevars 中,这意味着它来自另一个闭包。此外,如果您尝试在不使用 super 的情况下访问 __class__ 变量,出于同样的原因,它将使用 LOAD_DEFER 字节码而不是像 LOAD_GLOBAL对于每个未定义的名称都是正常的。

这太疯狂了,你不能只执行 hyper = super 并在没有参数的情况下调用这个新的 hyper 变量(它与 super)。

因为我无法与 Python 解释器中的这么多黑魔法竞争,并且因为 autosuper 装饰器没有在类中声明(所以它永远无法访问 __class__ 变量,即使这在 Python 2.x 中是可能的),我不会尝试编写一个新的装饰器并将这个答案留在这里作为对其他想要这样做的人的警告。

也许可以让一些骇客找到合适的类来使用,但我不会深入研究。需要考虑的事项:

  • 应用装饰器时,类还不存在,所以应该在调用装饰器函数时完成。
  • 被装饰的函数还不是一个未绑定(bind)方法(无论如何都从 Py3k 中删除了)所以你不能检查 im_class 属性。
  • 框架似乎没有保存用于进行此调用的类的任何信息(当然除非 __class__ 变量确实存在并且可以获得对它的引用)
  • This answer OP 提供的也很糟糕,因为它做了很多错误的假设,并且在修饰函数方面存在问题。

关于python - 在 Python 2.6+ 中使用 super(...) 时如何避免样板代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11812517/

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