当前位置: 首页 > 面试题库 >

super(type(self),self)的快捷方式

邢运良
2023-03-14
问题内容

在子类中重写方法时,我经常这样做:

def method_x(self):
    x = super(type(self), self).method_x()

    [Some extra code]
    return x

我的问题是:super(type(self),self)是否有捷径?


问题答案:

不要那样做:如果super仅可以type(self)将其用作第一个参数,那么就不必将它放在第一位。您必须在此处传递实际的类,而不是如果该类已被子类化的表达式可能会更改的表达式。

super的第一个参数必须是包含当前方法定义的类,因为您要告诉super在基础列表中从哪里开始搜索。

Python 3知道这一点,并super()在编译时对其进行了魔术般的处理,但是在Python
2.x中,它只是一个普通函数,因此它无法自行找出这些参数

[编辑以补充我的主要观点]实际上,super()在Python
2.x中还有另一种较少使用的方法。您可以使用super的未绑定形式,并在访问它时将其绑定:

>>> class A(object):
    def foo(self):
        print "A.foo"


>>> class B(A):
    def foo(self):
        self.__super.foo()
        print "B.foo"


>>> B._B__super = super(B)
>>> class C(A):
    def foo(self):
        self.__super.foo()
        print "C.foo"


>>> C._C__super = super(C)
>>> class D(C,B): pass

>>> D._D__super = super(D)
>>> D().foo()
A.foo
B.foo
C.foo

这里有一个重要的要点:您必须使用一个不同的名称来存储每个super对象,这可以通过使用来完成self.__super,但是您不能super直接在类定义中创建一个未绑定的对象(因为如果没有,则无法命名该类)。还不存在),如果您在外部创建它,则必须手动混淆名称,以确保__super为该类设置了正确的对象。对于Python
2.6和更高版本,您可以将其包装为类装饰器。



 类似资料:
  • 在路径上使用 super (父级)和 self(自身)关键字,可以在访问项时消除歧义和防止不必要的路径的硬编码。 fn function() { println!("called `function()`"); } mod cool { pub fn function() { println!("called `cool::function()`"); }

  • 最常用的BIF之一,返回调用进程的pid。 语法 (Syntax) self() 参数 (Parameters) 没有 返回值 (Return Value) 返回调用进程的pid。 例如 (For example) -module(helloworld). -export([start/0]). start() -> io:fwrite("~p~n",[self()]). 输出 (

  • 在定义类的过程中,无论是显式创建类的构造方法,还是向类中添加实例方法,都要求将 self 参数作为方法的第一个参数。例如,定义一个 Person 类: 那么,self 到底扮演着什么样的角色呢?本节就对 self 参数做详细的介绍。 事实上,Python 只是规定,无论是构造方法还是实例方法,最少要包含一个参数,并没有规定该参数的具体名称。之所以将其命名为 self,只是程序员之间约定俗成的一种习

  • 主要内容:语法,示例SQL SELF JOIN 用于将一个表和自身连接,就好像存在两个表一样。为了区分两个表,在 SQL 语句中需要至少重命名一个表。 自连接通常用于将表的某个字段与该表的同一字段的其它值进行比较。 语法 SELF JOIN 的基本语法如下: 您看,SQL 并没有 SELF JOIN 关键字,而是使用 WHERE 子句来达到自连接的目的。 示例 自连接的语法比较简单,但是结果往往不是那么容易理解,让我

  • Updates Yarn to the latest version. yarn self-update Note: self-update is not available. See policies for enforcing versions within a project

  • Vdt模板编译的结果,会添加如下代码 function(obj) { var self = this.data, scope = obj; .... } vdt.render() 方法这样调用模板函数 var vdt = { render: function() { template.call(vdt, data); ... } } 所以 this 模板中t