10月17日__new__方法学习以及__call__和__init__的关系

发布时间 2023-10-17 16:47:53作者: songjunwan

_ _ new _ _ 方法

将相当于生成了一个空对象

#__new__
class Person():
    def __init__(self, name, age):
        print('__init__')
        self.name = name
        self.age = age

    def __new__(cls, *args, **kwargs):
        # 这个方法就是生成一个Person类的空对象
        print('__new__')
        


p = Person('liu',18)
print(p.name)

结果如图

上面的结果说明了 _ _ new _ _ 方法是用于创建对象实例的方法,它是一个静态方法,这个方法在 _ _ init _ _生成对象前就被调用。这里的cls代表这个类名(Person)

如何使上面的代码查看实例对象的数据呢?这就要在 _ _ new _ _ 这个方法里面来返回实例对象了。

class Person():
    def __init__(self, name, age):#当我下面的实例对象被创建好了它会被自动调用,来用于初始化实例的属性
        print('初始化实例的属性')
        self.name = name
        self.age = age

    def __new__(cls, *args, **kwargs):
        print('先实例化对象')
        #这个方法就是生成一个Person类的空对象
        return object.__new__(cls)#这里创建了一个类的实例对象并且返回

p = Person('liu',18)
print(p.name)#查看属性

结果如图

这也说明了之前在生成实例对象时也调用了_ _ new _ _ 这个方法,只是python解释器没有显示出来。

所以两者就是 _ _ new _ _ 来创造一个新的对象,_ _ init _ _来给这个对象进行初始化然后添加属性

以老板和员工为例:

老板(Boss)可以雇佣员工(实例对象)定义了雇佣员工的方式(_ _ new _ _ )这个方法决定是否找新的员工,如果招了新的员工,这个员工入职后需要进行初始化的安排所属部门以及工作( _ _ init _ _ ).

所以 _ _ new _ _ 用于招聘新的员工,而 _ _ init _ _ 用于给这些新员工来安排部门(属性)和工作(方法)

现在来一个实例代码

# 定义员工类
class man:
    def __init__(self, name, bumen, gongzuo):
        self.name = name
        self.bumen = bumen
        self.gongzuo = gongzuo


#定义老板类
class Boss:
    def __new__(cls, name, bumen, gongzuo):
        #定义招聘新员工
        yuangong = man(name, bumen, gongzuo)
        return yuangong
#这里就招募了一个新员工
yuangong1 = Boss('韩','游戏开发','设计游戏封面')

#输出新员工的部门和工作
print(yuangong1.bumen)
print(yuangong1.gongzuo)

结果如图

总结在元类里 _ _ call _ _ 和 _ _ new _ _ 和 _ _ init _ _这三个方法的关系以及优先级

元类中

_ _ init _ _ :控制类的产生,在 _ _ new _ _ 之后

_ _ call _ _ :对着对象的产生

_ _ new _ _:控制类产生最根上,其实本质最根上也不是它,是type(所有类的元类),这个是无法控制的

它们之间的优先级: _ _ call _ _ 是最高优先级的,而 _ _ new _ _ 的优先级大于 _ _ init _ _

_ _ call _ _ > _ _ new _ _ > _ _ init _ _

你也可以理解

你现在有一个生产魔术道具的工厂

_ _ new _ _ 方法就是决定是否让新的道具进入工厂,相当于门卫,如果新的道具被接受,工厂就会为这个道具分配一个位置

_ _ init _ _ 方法就是工厂里的工人,他接受新道具,将它加工、组装并初始化,确保道具符合工厂的标准

_ _ call _ _ 方法就是工厂的电话号码,当你打电话给工厂并告诉你需要什么道具时,工厂就会制作并提供相应的道具。

综合来看, _ _ new _ _ 决定是否接受新的产品, _ _ init _ _ 初始化产品, _ _ call _ _ 允许你像打电话一样请求产品。这三者共同协作,使得工厂能够创建、初始化和提供产品。