首页 > 其他分享 >10月17日__new__方法学习以及__call__和__init__的关系

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

时间:2023-10-17 16:57:21浏览次数:24  
标签:__ 10 name 17 self 员工 init new

目录

_ _ 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

相关文章

  • python练习.5
    问:计算并输出100-200不能被三整除的整数的和voidtest1(){ intarr[10]={2,3,1,4,5,7,6,8,9,10}; intsi=sizeof(arr)/sizeof(arr[0]); qsort(arr,si,sizeof(arr[0]),ayue2); qsort(arr,si,sizeof(arr[0]),ayue3); inti=0; for(i=0;i<si;i++)......
  • D. Monocarp and the Set
    D.MonocarpandtheSetMonocarphas$n$numbers$1,2,\dots,n$andaset(initiallyempty).Headdshisnumberstothisset$n$timesinsomeorder.Duringeachstep,headdsanewnumber(whichhasnotbeenpresentinthesetbefore).Inotherwords,......
  • 视频监控/安防监控平台EasyCVR(V.3.4.0)界面更新大曝光,速来抢先看!
    视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频监控平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务......
  • SpringBoot 02 shiro框架查询用户权限与角色
      实体类 @Data@AllArgsConstructor@NoArgsConstructor@TableName("t_user")publicclassRUser{@TableId(value="id",type=IdType.AUTO)privateIntegerusrId;privateStringusrName;privateStringusrAccount;pri......
  • 学习笔记:Graph WaveNet
    GraphWaveNetforDeepSpatial-TemporalGraphModeling用于深度时空图模型的GraphWaveNet期刊:IJCAI2019作者:ZonghanWu,ShiruiPan,GuodongLong,JingJiang,ChengqiZhang论文地址:https://www.ijcai.org/Proceedings/2019/0264代码地址:https://github.com/nnzhan/Gr......
  • laravle cookie
    Laravel是一个流行的PHP框架,提供了方便的缓存功能来加速应用程序。有时候我们需要更改缓存值,本文将介绍如何在Laravel中更改缓存值。一、了解Laravel缓存在Laravel中,我们使用Cache类来操作缓存。Laravel支持多种缓存驱动,包括文件缓存、数据库缓存、Redis缓存等。......
  • 2023年石门中学NOIP模拟测试(2023.10.17)
    原题大战,还是\(4\)道计数...放个头图:一蓝一紫两黑,简单且原题0.o?出模拟赛搬原题演都不演了,他真的我哭死。那这总结不写也罢T1\(n\leq10^3\)。简单来说,要选出子序列满足相同颜色连续的方案数。签到题,但写了\(\text{1h}\)的我是sb。直接大力状压,设\(dp_{i,s,c}\)表......
  • [CSP-J2019] 加工零件
    题目描述凯凯的工厂正在有条不紊地生产一种神奇的零件,神奇的零件的生产过程自然也很神奇。工厂里有\(n\)位工人,工人们从\(1\simn\)编号。某些工人之间存在双向的零件传送带。保证每两名工人之间最多只存在一条传送带。如果\(x\)号工人想生产一个被加工到第\(L(L\gt1......
  • Chapter 2
    Chapter2线性时不变系统(LTI)离散LTI系统对于任意离散信号\(x[n]\),都有\[x[n]=\sum\limits_{k=-\infty}^{\infty}x[k]\delta[n-k]\]卷积对于系统LTI:\(x[n]\stackrel{LTI}{\rightarrow}y[n]\)设\(\delta[n]\)经过相同系统变为:$\delta[n]\stackrel{LTI}{\right......
  • 【开源分享】基于Html开发的房贷计算器,模仿新浪财经
    房贷计算器是一种房贷计算的在线计算Web应用,按用户选择的贷款类型、贷款金额、期限、利率可计算得出每月月供参考、支付利息、还款总额这些信息。本文模仿新浪财经开发的房贷计算器。作品预览https://fangdai.gitapp.cn源码地址https://github.com/geeeeeeeek/fangdai代码......