zoukankan      html  css  js  c++  java
  • Python中的__new__方法

    Python中的__new__方法

    一、总结

    一句话总结:

    __new__方法用于创建实例对象,__new__方法在创建类实例对象时由Python解释器自动调用

    1、python创建对象比如p1=Person()主要做了哪些工作?

    首先调用Person的__new__方法,该方法通过object.new(cls)创建了Person实例对象,并返回。最后调用了该Person实例对象的__init__方法。

    二、Python中的__new__方法

    转自或参考:Python中的__new__方法
    https://blog.csdn.net/weixin_41557802/article/details/84190218

    只有继承于object的新式类才能有__new__方法,__new__方法在创建类实例对象时由Python解释器自动调用,一般不用自己定义,Python默认调用该类的直接父类的__new__方法来构造该类的实例,如果该类的父类也没有重写__new__,那么将一直按此规矩追溯至object的__new__方法,因为object是所有新式类的基类,若需要自定义__new__方法,一般用法如下:

    class Person(object):
        def __new__(cls):
            return  object.__new__(cls)

    __new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供;__new__必须要有返回值,返回实例化出来的实例,可以return父类new出来的实例,或直接是object的new出来的实例。
    object.new(cls)执行完返回的结果为Person类的实例对象,如下:

    class Person(object):
        def __init__(self):
            print("__init__")
            self.name="张三"
        def __new__(cls):
            print('__new__')
            ob = object.__new__(cls)#ob为Person实例对象
            print(ob)
            return ob
    p1 = Person()
    print(p1.name)



    p1=Person()该语句主要做了以下工作:
    首先调用Person的__new__方法,该方法通过object.new(cls)创建了Person实例对象,并返回。最后调用了该Person实例对象的__init__方法。

    object.new()方法接收的参数是类对象,可以不是当前类对象cls,如果将cls换成其他类对象会发生什么呢,看下面代码的运行结果:

    class Dog(object):
        def __init__(self):
            self.name="旺财"
            print("Dog.__init__")
    class Person(object):
        def __init__(self):
            self.name="张三"
            print("Person.__init__")
        def __new__(cls):
            print('__new__')
            ob = object.__new__(Dog)
            return ob
    p1 = Person()
    print(type(p1))


    由结果得知p1是Dog类的实例,但是有个问题,Python解释器没有自动执行__init__方法,由结果可以看出并没有打印字符串__init__。若__new__()没有正确返回当前类cls的实例,那__init__()将不会被调用。 我们可以在__new__方法中手动调用__init__方法(实际开发中好像没什么用)

    class Dog(object):
        def __init__(self):
            self.name="旺财"
            print("__init__")

    class Person(object):
        def __init__(self):
            self.name="张三"
            print("__init__")
        def __new__(cls):
            print('__new__')
            ob = object.__new__(Dog)
            ob.__init__()
            return ob

    p1 = Person()
    print(type(p1))
    print(p1.name)

     
  • 相关阅读:
    原生ES-Module在浏览器中的尝试
    常见的web攻击总结
    node第三方模块----nodemailer发送邮件
    08----mockjs处理前端传来的路径,获取?后面的值
    07----mockjs获取前端传递的数据
    05-----Mock.Random 扩展方法
    03----Mock.mock() 生成接口,随机数据
    06----Mock.setup()
    十一. for of
    十.数组解构
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/13156805.html
Copyright © 2011-2022 走看看