zoukankan      html  css  js  c++  java
  • Python 之 __new__() 方法与实例化

    https://www.cnblogs.com/ifantastic/p/3175735.html

    在继承基类实例化时,首先调用的__new__方法根据其第一个参数(即将生成的类)确定用哪个基类的__init__方法去初始化。

    __new__方法是实例化的准备工作,在__init__之前运行。__init__是真正的实例化

     1 class Foo(object):
     2     def __init__(self, *args, **kwargs):
     3         ...
     4     def __new__(cls, *args, **kwargs):
     5         return object.__new__(cls, *args, **kwargs)    
     6 
     7 # 以上return等同于 
     8 # return object.__new__(Foo, *args, **kwargs)
     9 # return Stranger.__new__(cls, *args, **kwargs)
    10 # return Child.__new__(cls, *args, **kwargs)
    11 
    12 class Child(Foo):
    13     def __new__(cls, *args, **kwargs):
    14         return object.__new__(cls, *args, **kwargs)
    15 # 如果Child中没有定义__new__()方法,那么会自动调用其父类的__new__()方法来制造实例,即 Foo.__new__(cls, *args, **kwargs)。
    16 # 在任何新式类的__new__()方法,不能调用自身的__new__()来制造实例,因为这会造成死循环。因此必须避免类似以下的写法:
    17 # 在Foo中避免:return Foo.__new__(cls, *args, **kwargs)或return cls.__new__(cls, *args, **kwargs)。Child同理。
    18 # 使用object或者没有血缘关系的新式类的__new__()是安全的,但是如果是在有继承关系的两个类之间,应避免互调造成死循环,例如:(Foo)return Child.__new__(cls), (Child)return Foo.__new__(cls)。
    19 class Stranger(object):
    20     ...
    21 # 在制造Stranger实例时,会自动调用 object.__new__(cls)
  • 相关阅读:
    Properties类
    缓冲流
    Mybatis
    分页查询
    QueryRunner和JDBC连接池
    JSP
    Session
    Cookie
    http协议和eclipes绑定tomcat
    servlet
  • 原文地址:https://www.cnblogs.com/Henry-ZHAO/p/12725132.html
Copyright © 2011-2022 走看看