zoukankan      html  css  js  c++  java
  • python __new__ 与__init__函数

    __new__(cls[, ...])

    This method is only used for new-style classes (classes inheriting from object).

    Called to create a new instance of class cls. __new__ is a static method (special-cased so you need not declare it as such) that takes the class of which an instance was requested as its first argument. The remaining arguments are those passed to the object constructor expression (the call to the class). The return value of __new__ should be the new object instance (usually an instance of cls).

    Typical implementations create a new instance of the class by invoking the superclass's __new__ method using "super(currentclass, cls).__new__(cls[, ...])" with appropriate arguments and then modifying the newly-created instance as necessary before returning it.

    If __new__ returns an instance of cls, then the new instance's __init__ method will be invoked like "__init__(self[, ...])", where self is the new instance and the remaining arguments are the same as were passed to __new__.

    If __new__ does not return an instance of cls, then the new instance's __init__ method will not be invoked.

    [__new__]] is intended mainly to allow subclasses of immutable types (like [int, str, or tuple) to customize instance creation.

    __new__主要可以用来继承。

    class A(object):
      def __new__(cls, *args, **kwds):
        print "one"
        print "A.__new__", args, kwds
        return object.__new__(B, *args, **kwds)
      def __init__(cls, *args, **kwds):
        print "two"
        print "A.__init__", args, kwds
    class B(object):
      def __new__(cls, *args, **kwds):
        print "three"
        print cls
        print B
        print "B.__new__", args, kwds
        return object.__new__(cls, *args, **kwds)
      def __init__(cls, *args, **kwds):
        print "four"
        print "B.__init__", args, kwds
    class C(object):
      def __init__(cls, *args, **kwds):
        print "five"
        print "C.__init__", args, kwds
    print C()
    print "====================="
    print A()
    print "====================="
    print B()

    And here's the result of running that code:

    40:~/ndfi grahamellis$ python newvinit
    five
    C.__init__ () {}
    <__main__.C object at 0x6fc10>
    =====================
    one
    A.__new__ () {}
    <__main__.B object at 0x6fc10>
    =====================
    three
    <class '__main__.B'>
    <class '__main__.B'>
    B.__new__ () {}
    four
    B.__init__ () {}
    <__main__.B object at 0x6fc10>
    40:~/ndfi grahamellis$


  • 相关阅读:
    vue 路由跳转传参
    vue better-scroll 下拉上拉,加载刷新
    H5点击拨打电话,发短信
    vue搭建项目
    How to determine the socket connection up time on Linux
    @ContextConfiguration注解
    MySQL修改主键属性
    软件测试工程师面试(一)
    Python实现不同格式打印九九乘法表
    MySQL 5.1安装和配置过程中遇到的问题
  • 原文地址:https://www.cnblogs.com/lovemo1314/p/2034927.html
Copyright © 2011-2022 走看看