• 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
  • 相关阅读:
    在数组中寻找和为定值的n个数
    第九届蓝桥杯省赛第六题---递增三元组
    序列螺旋矩阵
    铁轨
    最长公共子串
    STL之vector,deque学习实例
    jdbc Date问题(util.Date和sql.Date)DatePreparedStatement.set
    inti-mothd
    获取HttpResponse并解析JSON数据
    could not find the main class,program will exit
  • 原文地址:https://www.cnblogs.com/Jghost/p/3640908.html
Copyright © 2020-2023  润新知