super(子类,类)和new(类)是做什么的?

2024-06-16 18:45:59 发布

您现在位置:Python中文网/ 问答频道 /正文

Singleton pattern的以下Python实现中:

class Singleton(object):
    def __new__(cls):
        if not hasattr(cls, 'instance'):
            cls.instance = super(Singleton, cls).__new__(cls)
        return cls.instance

cls.instance = super(Singleton, cls).__new__(cls)做什么?你知道吗

在这一行中,我不明白的是super用法。我看到了super(subclass, instance)的用法,但这里我们传递了它(subclass, class)。所以它会有(Singleton class, Singleton class)作为参数吗?你知道吗

Live example


Tags: instance用法newreturnifobjectdefnot
1条回答
网友
1楼 · 发布于 2024-06-16 18:45:59

super()的第二个参数用于两个目的:

  • 提供要搜索的类的有序列表;顺序是方法解析顺序(MRO),在super()上搜索属性从super()的第一个参数后面的类开始

  • 将任何描述符(如方法)绑定到。

因此super(clsobject, second_argument)将查找__mro__列表,然后搜索clsobject,然后继续在列表的其余部分搜索所需的属性。然后它使用descriptor protocol将对象绑定到second_argument。你知道吗

__new__方法只对类有意义,因为它创建了一个新实例;调用该方法时还没有实例;应该是工厂为该类生成实例。你知道吗

所以不能将实例作为第二个参数传入。您只能传入一个类,super()可以处理它。例如,super()查看type(instance).__mro__,但是对于类,使用classobject.__mro__。所以在这里传递cls是非常好的。你知道吗

__new__也是一个静态方法,这意味着它忽略了绑定过程。不会自动传入第一个参数类。您需要手动执行此操作,因此...__new__(cls)调用。你知道吗

在这个特定的例子中,行:

cls.instance = super(Singleton, cls).__new__(cls)

将在cls.__mro__中搜索Singleton,找到下一个具有__new__属性的对象,然后尝试将该__new__属性绑定到cls。如果您没有使用多重继承,那将是object.__new____new__方法是静态的,因此不发生任何绑定,因此给您提供了object.__new__,然后用cls作为第一个参数调用它。这将生成Singleton类(或其子类)的实例,然后将其分配给class对象上的属性instance。你知道吗

相关问题 更多 >