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_方法的形参是对象