在Python 2.6中使用super(…)时如何避免样板?

前端之家收集整理的这篇文章主要介绍了在Python 2.6中使用super(…)时如何避免样板?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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;博士

正如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,**kw)
    return f

怎么可以这样做? Python 3.x确实有一个不带参数的超级函数

不幸的是,Python 3.x的super是一个类,同时也是一个关键字,因为它的名称只会改变当前环境,以揭示一个名为__class__的变量,这是你需要使用的正确类!

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

这太疯狂了,你不能只做hyper = super并且在没有参数的情况下调用这个新的超变量(这与super完全相同).

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

可能有些hackeries可以找到合适的类来使用,但我不会那么深入.需要考虑的事项:

>当应用装饰器时,该类尚不存在,因此应该在调用装饰函数时完成.
>正在修饰的函数还不是一个未绑定的方法(无论如何从Py3k中删除),因此您无法检查im_class属性.
>框架似乎不包含用于进行此调用的类的任何信息(除非__class__变量确实存在并且可以获得对它的引用)
OP提供的> This answer也很破碎,因为它做了很多不好的假设并且在装饰功能方面存在问题.

猜你在找的Python相关文章