tec*_*kuz 3 python inheritance
在以下Singleton模式的Python实现中:
class Singleton(object):
def __new__(cls):
if not hasattr(cls, 'instance'):
cls.instance = super(Singleton, cls).__new__(cls)
return cls.instance
Run Code Online (Sandbox Code Playgroud)
这条线cls.instance = super(Singleton, cls).__new__(cls)做什么?
在这一行中,我不明白的是super用法.我看到了superwith的用法(subclass, instance),但在这里我们通过它(subclass, class).它会(Singleton class, Singleton class)作为参数吗?
第二个参数super()用于两个目的:
提供要搜索的有序类列表; 顺序是方法解析顺序(MRO),并在super()类名为第一个参数的类之后的类中开始搜索属性super()
绑定任何描述符(如方法).
因此,super(clsobject, second_argument)将查找__mro__列表,然后搜索clsobject,然后继续搜索列表的其余部分以查找所需的属性.然后,它使用描述符协议将对象绑定到second_argument.
该__new__方法仅对类有意义,因为它创建了一个新实例; 调用该方法时还没有实例; 它是应该为该类生成实例的工厂.
所以你不能传递一个实例作为第二个参数.你只能传入一个类,并且super()可以处理它.对于实例,super()查看type(instance).__mro__,但对于类,classobject.__mro__则使用.所以传入cls这里完全没问题.
__new__也是一个静态方法,意味着它忽略了绑定过程.不会自动传入第一个参数,即类.您需要手动执行此操作,因此需要执行此操作...__new__(cls).
所以在这个特定的例子中,行:
cls.instance = super(Singleton, cls).__new__(cls)
Run Code Online (Sandbox Code Playgroud)
将搜索Singleton中cls.__mro__,发现有下一个对象__new__的属性,然后尝试结合__new__属性cls.如果你没有使用多重继承,那就是object.__new__.该__new__方法是静态的,因此不会发生绑定,因此您将获得object.__new__,然后将其cls作为第一个参数调用.这将生成Singleton类(或其子类)的实例,然后将其分配给instance类对象上的属性.
| 归档时间: |
|
| 查看次数: |
76 次 |
| 最近记录: |