python – super(子类,类).__ new __(class)做什么?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – super(子类,类).__ new __(class)做什么?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1513字,纯文字阅读大概需要3分钟。
内容图文
![python – super(子类,类).__ new __(class)做什么?](/upload/InfoBanner/zyjiaocheng/728/c39c23189da64419b61fe79be2d9ad9f.jpg)
在以下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的用法(子类,实例),但在这里我们传递它(子类,类).它会(Singleton类,Singleton类)作为参数吗?
解决方法:
super()的第二个参数用于两个目的:
>提供要搜索的有序类列表;顺序是方法解析顺序(MRO),在super()上搜索属性从名为super()的第一个参数的类开始.
>将任何描述符(如方法)绑定到.
因此super(clsobject,second_argument)将查找__mro__列表,然后搜索clsobject,然后继续在列表的其余部分搜索所需的属性.然后使用descriptor protocol将对象绑定到second_argument.
__new__方法只对类有意义,因为它创建了一个新实例;调用该方法时还没有实例;它是应该为该类生成实例的工厂.
所以你不能传递一个实例作为第二个参数.你只能传入一个类,而super()可以处理它.例如,super()查看类型(实例).__ mro__,但对于类,使用classobject .__ mro__代替.所以传递cls在这里完全没问题.
__new__也是一个静态方法,这意味着它忽略了绑定过程.不会自动传入第一个参数,即类.您需要手动执行此操作,因此需要调用___ new __(cls).
所以在这个特定的例子中,行:
cls.instance = super(Singleton, cls).__new__(cls)
将在cls .__ mro__中搜索Singleton,找到具有__new__属性的下一个对象,然后尝试将该__new__属性绑定到cls.如果你没有使用多重继承,那将是对象.__ new__. __new__方法是静态的,因此不会发生绑定,因此您将获得对象.__ new__,然后使用cls作为第一个参数调用它.这将生成Singleton类(或其子类)的实例,然后将其分配给类对象上的属性实例.
内容总结
以上是互联网集市为您收集整理的python – super(子类,类).__ new __(class)做什么?全部内容,希望文章能够帮你解决python – super(子类,类).__ new __(class)做什么?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。