zoukankan      html  css  js  c++  java
  • python -- why defined '__new__' and '__init__' all in a class

    在学习openstack源码的时候发现一个类里面有'__new__' 和'__init__'两个构造,不知道什么原因,在stackoverflow中找到了满意的解答:

    粘贴解答至此:

    You can define either or both of __new__ and __init__.

    __new__ must return an object -- which can be a new one (typically that task is delegated to type.__new__), an existing one (to implement singletons, "recycle" instances from a pool, and so on), or even one that's not an instance of the class. If __new__ returns an instance of the class (new or existing), __init__ then gets called on it; if __new__ returns an object that's not an instance of the class, then __init__ is not called.

    __init__ is passed a class instance as its first item (in the same state __new__ returned it, i.e., typically "empty") and must alter it as needed to make it ready for use (most often by adding attributes).

    In general it's best to use __init__ for all it can do -- and __new__, if something is left that __init__ can't do, for that "extra something".

    So you'll typically define both if there's something useful you can do in __init__, but not everything you want to happen when the class gets instantiated.

    For example, consider a class that subclasses int but also has a foo slot -- and you want it to be instantiated with an initializer for the int and one for the .foo. As int is immutable, that part has to happen in __new__, so pedantically one could code:

    >>>class x(int):...def __new__(cls, i, foo):...     self = int.__new__(cls, i)...return self
    ...def __init__(self, i, foo):...     self.foo = foo
    ...   __slots__ ='foo',...>>> a = x(23,'bah')>>>print a
    23>>>print a.foo
    bah
    >>>

    In practice, for a case this simple, nobody would mind if you lost the __init__ and just moved the self.foo = foo to __new__. But if initialization is rich and complex enough to be best placed in __init__, this idea is worth keeping in mind.

    share|improve this answer
  • 相关阅读:
    无法作为数据库主体执行,因为主体 "dbo" 不存在、无法模拟这种类型的主体,或您没有所需的权限
    sql server 2008收缩数据库日志
    c#基本语法
    写点东西
    转载 程序人生成长发展中的一些感悟
    C#基本问题
    对象入门
    21k8s部署discuz
    Mysql基础管理
    将枚举作为参数,迭代枚举。Passing Enum type as a parameter
  • 原文地址:https://www.cnblogs.com/Jghost/p/3640908.html
Copyright © 2011-2022 走看看