python3中_new_和_init_的不同

python3中_new_和_init_的不同:

 原理:类创建对象时,若类中定义了_init_方法(重写了父类的_init_方法,会覆盖父类的_init_方法,但通过super()方法也可以继承父类的_init_方法),但没定义_new_方法,会自动调用父类object的_new_方法通过系统的方式创建对象,对象一创建完会自动调用类中定义的_init_方法.

class Dog(object):
    def __init__(self):
        '对象一创建完就会调用'
        print('对象初始化')
dog1 = Dog()
  打印结果:

对象初始化

class Dog(object):
    def __new__(cls, *args, **kwargs):
        #创建对象时调用
        print('创建对象')
        return '1'
    def __init__(self):
        '对象一创建完就会调用'
        print('对象初始化')
dog1 = Dog()
print(dog1)
打印结果:

创建对象
1

因为不是按照系统的方式创建对象,所以就不会调用_init_方法

#用汉字模拟通过系统的方式创建对象即默认的object类中_new_方法创建对象
# class object:
#     def __new__(cls, *args, **kwargs):
#         print("创建对象")
#         return "系统的方式创建的对象"

class Dog(object):
    def __new__(cls, *args, **kwargs):
        #创建对象时调用
        print('创建对象')
        #返回默认的父类object通过_new__方法创建的对象,即通过系统的方式创建的对象
        return object.__new__(cls)
    def __init__(self):
        '对象一创建完就会调用'
        print('对象初始化')
dog1 = Dog()
print(dog1)
打印结果:

创建对象
对象初始化
<__main__.Dog object at 0x000000000290B898>

class Dog(object):
    def __new__(cls, *args, **kwargs):
        #创建对象时调用
        print('创建对象')
        #会将返回值提供给引用对象变量
        return '1'
    def __init__(self):
        '对象一创建完就会调用'
        print('对象初始化')
dog1 = Dog()
print(dog1)
打印结果:

创建对象
1

不按系统方式创建对象,返回对象'1',就不会调用_init_方法

"""类方法"""
# class Dog:
#     __type = "狗"  # 类属性
#
#     #  类方法: 和类属性配合使用,想要访问或者修改类属性时,可以定义类方法
#     @classmethod  # 方法上边添加 @classmethod 标识,就会自动生成类方法
#     def get_type(cls):  # 类方法会自动设置第一个形参为cls,调用时自动设置类对象为第一个实参
#         return cls.__type
#
#
# # 调用类方法 对象名和类名都可以访问
# dog1 = Dog()
# result = Dog.get_type()
# result = dog1.get_type()
# print(result)
class Dog(object):
    __type = '狗'#类属性
    def __new__(cls, *args, **kwargs):
        #创建对象时调用
        print('创建对象')
        #会将返回值提供给引用对象变量
        return cls.__type
    def __init__(self):
        '对象一创建完就会调用'
        print('对象初始化')
dog1 = Dog()
print(dog1)
打印结果:

创建对象

(1)

_new_方法是在创建对象时调用的;

_init_方法是在对象一创建完就调用,而且只有通过系统的方法创建的对象才会执行_init_方法,object默认的_new_方法会先于_init_方法调用

(2)

_new_方法的形参是类,而_init_方法的形参是对象


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值