九. __init__ 和 __new__

九. __init__ 和 __new__

1.先看代码 :

class Person:
    def __init__(self,name):
        print("触发__init__")
        self.name = name

    def __new__(cls, *args, **kwargs):
        print("触发__new__")
        # obj = object.__new__(cls)  # 这个是直接使用 object 实例出来的对象
        obj = super(Person,cls).__new__(cls)  # 这个是通过当前类的父类实例出来的对象
        return obj

p = Person("shawn")
# 触发__new__
# 触发__init__

print(p.name)  # shawn
  • 在一个类中如果没有重写__new__()方法, 那么就会使用父类中的__new__()方法, 如果父类中没有, 则会一直追溯到 object 中的__new__()方法

  • 如果在类中重写了__new__()方法, 我们可以通过 return 出一个实例, 该实例可以直接是 object 实例出来的对象, 也可以是当前类的父类实例出来的对象 (看上面代码)

  • return 当前类的对象就会自动触发__init__()方法, 该实例是通过 cls 参数来控制是当前类的实例, 如果是别的类的实例或者其他任意东西则不会触发__init__()的执行

  • 无法触发__init__ 示例 :
🐞当"return"的不是当前类的实例,是其它的一些任意数据
class Persion:
    def __init__(self,name):
        print("触发__init__")
        self.nam = name

    def __new__(cls, *args, **kwargs):
        print("触发__new__")
        obj = super(Person,cls).__new__(cls)
        return 1111

p = Person("shawn")  # 触发__new__ (没有触发__init__的执行)
print(p.name)  # 抛出异常 : "AttributeError" 没有这个属性

🐞当"return"的不是当前类的实例,是其它类的实例(这里我们让Person继承Str,然后return出Str的实例)
class Str:
    '''
    Str_obj
    '''

class Person(Str):
    def __init__(self,name):
        print("触发__init__")
        self.name = name

    def __new__(cls, *args, **kwargs):
        print("触发__new__")
        obj = super(Str,Str).__new__(Str)
        print(obj.__doc__)   # Str_obj
        return obj

p = Person("shawn")  # 触发__new__  (同样只是触发__new__,并没有触发__init__方法)
print(p.name)  # 同样抛出异常 : "AttributeError" 没有这个属性

2.使用方法比较

  • __new__() 用于创建实例,所以该方法是在实例创建之前被调用,它是类级别的方法,是个静态方法

  • __init__() 用于初始化实例,所以该方法是在实例对象创建后被调用,它是实例级别的方法,用于设置对象属性的一些初始值

  • 由此可知,__new__()__init__() 之前被调用。如果__new__() 创建的是当前类的实例,会自动调用__init__()函数

3.传入参数比较

  • __new__() 至少有一个参数 cls, 代表当前类, 此参数在实例化的时候由 Python 解释器自动识别
  • __init__() 至少有一个参数 self, 就是__new__()返回的实例, __init__()__new__()的基础上完成一些初始化的操作

4.返回值的比较

  • __new__()必须要有返回值, 返回实例对象
  • __init__()不需要返回值
posted @ 2021-01-05 22:17  给你骨质唱疏松  阅读(119)  评论(0)    收藏  举报