super()返回的超级对象的类型是什么?

提姆

这里

super( [ type [ , object-or-type ]] )

返回将方法调用委托给的父级或同级类的代理对象type这对于访问已在类中重写的继承方法很有用。搜索顺序与所使用的顺序相同,getattr()只是type略过本身。

如果省略第二个参数,则返回的超级对象是未绑定的。

如果第二个参数是一个对象,则isinstance(obj, type)必须为true。

如果第二个参数是type,则issubclass(type2, type)必须为true(这对于类方法很有用)。

  1. 如果我是对的,则类型是类,而类是类型。类是对象,所以类型也是对象。当第二个参数是对象时,为什么引号区分这两种情况?

  2. 当第二个参数是类型时,为什么issubclass(type2, type)必须为真?

  3. super三种情况分别返回的超级对象的类型是什么或如何确定由返回的超级对象的类型super

    当第二个参数是一个对象时,因为“搜索顺序与它使用的搜索顺序相同,getattr()只是它type自身被跳过”,所以我猜测super函数返回的超对象的类型应该是第一个参数的任何祖先类的子类。type但是我发现实际上不是通过使用进行测试issubclass那我误会了吗?

马丁·彼得斯(Martijn Pieters)

您似乎将这个词typetype()内置混淆了在这里,他们只是引用传递给的第一个参数super()

文档告诉您的是,如果您传入两个参数,则第二个参数要么必须是第一个参数的实例,要么必须是子类。换句话说,无论是isinstance(first_argument, second_argument)issubclass(first_argument, second_argument)必须是真实的。这里没有其他含义

int()str()其他任何内置类型一样,通过调用返回的对象的类型super() 就是那个type没有为不同的参数返回单独的类型。请参见定义对象C源代码

super()对象实现一个实现特定属性行为__getattribute__钩子该文件告诉你的是,规则的属性查找是一样的getattr()(但与记录MRO跳过),但这并不意味着super()收益的祖先类。

实际发生的是,super().__getattribute__采用第二个参数的MRO(无论是type(instance).__mro__cls.__mro__,取决于羯羊isinstance()issubclass()为真),发现该序列的第一个参数,并开始测试了之后的属性。因为首先要对MRO扫描第二个参数的(类型),所以它必须是可找到的,这就是为什么约束是它们的原因。

在Pure Python中,这是做什么的super()(简化为仅关注两个参数行为):

def _supercheck(type_, obj):
    try:
        if issubclass(obj, type_):
            return obj
    except TypeError:
        # obj is not a type so issubclass throws a TypeError
        pass
    if isinstance(obj, type_):
        return type(obj)
    raise TypeError(
        "super(type, obj): obj must be an instance or subtype of type")


class super_:
    def __init__(self, type_, obj):
        # simplified for the two-argument case
        self.type_ = type_
        self.obj = obj
        self.obj_type = _supercheck(type_, obj)

    def __getattribute__(self, name):
        if name == '__class__':
            # __class__ should always come from this object, not
            # the represented MRO.
            return super().__getattribute__(name)

        # avoid infinite recursion issues
        sd = super().__getattribute__('__dict__')
        starttype = sd['obj_type']
        type_ = sd['type_']
        obj = sd['obj']

        mro = iter(starttype.__mro__)

        # skip past the start type in the MRO
        for tp in mro:
            if tp == type_:
                break

        # Search for the attribute on the remainder of the MRO
        for tp in mro:
            attrs = vars(tp)
            if name in attrs:
                res = attrs[name]
                # if it is a descriptor object, bind it
                descr = getattr(type(res), '__get__', None)
                if descr is not None:
                    res = descr(
                        res,
                        None if obj is starttype else obj,
                        starttype)
                return res

        return super().__getattribute__(name)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

用CreateODBCDateTime()创建的对象的返回类型是什么?

php 中 SQL SELECT 查询的返回类型是什么,是数组、对象还是什么?

linq的返回类型是什么?

Angular DI注入的超级剂的正确类型是什么?

枚举对象的类型是什么

让成员函数返回类型成为要返回的实际对象的超类的正确方法是什么?

当具有属性子集的对象访问项目时,DynamoDB 返回的对象类型是什么?

返回自身的函数的返回类型是什么?

传递类型,经过一些条件并返回对象的良好设计模式是什么

返回多个对象的cmdlet,它是什么收集类型?[电源外壳]

返回一个对象(该对象是原始对象的子集)的函数的类型定义会是什么样子

InfoChyb 类的方法返回类型是什么

quandl.get返回的类型是什么?

NoContent HTTP 响应的返回类型是什么?

要构建的正确返回类型是什么?

索引操作的返回类型是什么?

CONFIGRET返回类型是什么意思?

函数的返回类型中{}的目的是什么?

响应的json方法的返回类型是什么?

动态导入的返回类型是什么?

T*&返回类型到底是什么

`use` 指令的返回类型是什么?

标记的“返回类型”是什么功能?

该指针的返回类型是什么?

快速数组返回元素的类型是什么?

超级initWIthCoder返回父类型?

匿名类的对象类型是什么

MyPy:请求对象的类型是什么?

熊猫:对象类型的真正含义是什么?