一直嚷嚷着面向对象编程,对象是咋出来的?
刚学面向对象的时候,其他啥也没记住,就记住一个__init__方法,当时就感觉这方法很牛皮,能搞一个对象出来,但是直到有一天手贱点object源码看,才发现自己一直都是错的。
??? 为什么是initialize不是create?继续往下找
Create and return new object,人家清清楚楚的写着,是我创建的对象。
那行吧,我隐约的认识到是__new__创建的对象,__init__只是赋了属性,
以代码为准,自己搞一下来看看
class A(object):
def __new__(cls, *args, **kwargs):
print(cls.__name__) #看看这个cls是谁
print("是我创建的对象")
a = object.__new__(cls) #要依靠object基类的方法
a.name = "a"
print(id(a)) #看看这创建的对象是否与下边实例化出来的对象是一个东西
return a
def __init__(self,age):
print(self.name) #看看这个self是谁
self.age = age
print("我负责给对象属性")
m = A(1)
print(id(m))
运行结果:
来分析一下:
1.因为先出现"我创建的对象",所以__new__先于__init__执行
2.传入__new__是A这个类,那么调用object返回的对象就是A类的实例
3.__new__创建的对象的id与传入__init__的对象的id以及类实例化之后的对象的id一样,他们三个是同一个东西
好了,到了这,基本流程我们也能看出来了:
首先一个类实例化一个对象时,先调用__new__来创建一个对象(没有任何属性),之后__init__拿到这个对象后给对象属性。