Python __new__与__int__演示创建对象的过程

__new__()是创建对象方法
__int__()是初始化对象方法
class Person(object):
    #创建(对象)方法
    def __new__(cls, *args, **kwargs):
    #2.Person传给了cls,就是创建的对象的类型传给了cls,所以id(cls)=id(Person)
        print('__new__调用的cls,id:{0}'.format(id(cls)))#1621114168000
        obj=super().__new__(cls)#3.把Person传进了object里,创建对象obj
        print('创建的对象obj的id:{0}'.format(id(obj)))#1621115397712
        return obj#返回obj
    #初始化(对象)方法
    def __init__(self,name,age):#4.把obj传给了self,所以id(obj)=id(self)
        print(' __init__调用,self的id:{0}'.format(id(self)))#1621115397712
        self.name=name
        self.age=age


print('object类对象的id:{0}'.format(id(object)))#140703538755456
print('Person类对象的id:{0}'.format(id(Person)))#1621114168000,Person类的标识

p1=Person('陈皮',18)#1.首先执行的是Person(),把person传给cls.实例对象,id(p1)=id(self)
print('陈皮的id:{0}'.format(id(p1)))#1621115397712

 结果:

object类对象的id:140703538755456
Person类对象的id:1621114168000
__new__调用的cls,id:1621114168000
创建的对象obj的id:1621115397712
 __init__调用,self的id:1621115397712
陈皮的id:1621115397712

解释:

'''new方法里被创建的对象obj就是init里的self和p1
p1=Person('陈皮',18),
先执行Person('陈皮',18),把Person这个类对象传给new中的cls-->就是把要创建对象的类传给cls,确定实例对象的类型
然后又重写了object类中的new方法,创建了对象obj,返回obj-->obj就是实例对象p1的前身
然后把obj传给init方法中的self,给对象obj设置参数name和age-->就是给obj添加了内容,把'陈皮'和18加了进去
Person('陈皮',18)执行完成,把Person('陈皮',18)赋给p1,实例对象创建完成
'''

可以再创建一个实例对象 ,进行验证:

print('---------悟空------------')
p2=Person('孙悟空',387)
print('孙悟空的id:{0}'.format(id(p2)))

结果:

---------悟空------------
__new__调用的cls,id:1621114168000
创建的对象obj的id:1621115397616
 __init__调用,self的id:1621115397616
孙悟空的id:1621115397616

id(obj)=id(self)=id(p2),

id(cls)=id(Person), 正确

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`__init__()` 和 `__new__()` 是 Python 中的两个特殊方法,用于创建和初始化对象。它们的主要区别如下: 1. `__new__()` 是一个用于创建对象的静态方法,它在对象实例化之前调用。它的作用是创建并返回一个新的对象实例。`__new__()` 方法的第一个参数是类本身(通常为 `cls`),后面的参数是传递给 `__init__()` 方法的参数。 2. `__init__()` 是一个初始化方法,它在对象实例化后调用。它用于设置对象的初始状态,并接收传递给构造函数的参数。`__init__()` 方法不返回任何值,它只是在对象创建后对其进行初始化。 简而言之,`__new__()` 负责创建对象并返回实例,而 `__init__()` 负责初始化对象的状态。 下面是一个示例,演示了 `__new__()` 和 `__init__()` 的使用: ```python class MyClass: def __new__(cls, *args, **kwargs): print("Creating new instance") instance = super().__new__(cls) return instance def __init__(self, *args, **kwargs): print("Initializing instance") self.name = kwargs.get('name', 'Unknown') obj = MyClass(name='John') ``` 在上述示例中,当创建 `MyClass` 的实例时,`__new__()` 方法首先被调用,然后调用 `__init__()` 方法进行初始化。`__new__()` 方法返回一个实例,然后将该实例作为第一个参数传递给 `__init__()` 方法。输出结果如下: ``` Creating new instance Initializing instance ``` 可以看到,`__new__()` 方法在 `__init__()` 方法之前被调用。 需要注意的是,一般情况下不需要自己实现 `__new__()` 方法,而是使用继承自基类的默认实现。`__init__()` 方法通常用于初始化对象的属性和状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值