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
  • 相关阅读:
    Apache Tomcat 6.0 Tomcat6 服务因 1 (0x1) 服务特定错误而停止
    PaodingAnalysis 提示 "dic home should not be a file, but a directory"
    mappingDirectoryLocations
    多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合
    java.util.ResourceBundle
    JSP验证码
    Error: [ng:areq] Argument 'LoginCtrl' is not a function, got undefined
    《横向领导力》笔记
    Java执行定时任务
    2017第43周三
  • 原文地址:https://www.cnblogs.com/Jghost/p/3640908.html
Copyright © 2011-2022 走看看