目录
_ _ 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 _ _ 允许你像打电话一样请求产品。这三者共同协作,使得工厂能够创建、初始化和提供产品。
标签:__,10,name,17,self,员工,init,new From: https://www.cnblogs.com/slzjb/p/17770111.html