一直以来没搞懂python中对象创建的过程,这里作了一些小测试,进行学习
首先如以下类A,t=A(),那这个过程中发生了什么
在debug中发现该程序首先进入pydevd.py,执行一个
pydev_imports.execfile(file, globals, locals) # execute the script
这里file是文件名
globals和locals都是{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__': 'D:/python\xd3\xd0\xc8\xa4\xb5\xc4\xb5\xd8\xb7\xbd/001.py', '__doc__': None, '__package__': None}
进入执行的py文件后:
对A类型的处理,
首先得到:
__module__=(str)'__main__'
当前模块是__main__,然后会找到__init____,发现是一个__init__={function}<function __init__ at 0x02E3F3F0>,python中,除了关键字,其余都是对象
所以这里的__init__也是一个对象其地址为0x02E3F3F0
然后找到new,然后得到A()={dict}{'__module__': '__main__', '__new__': <function __new__ at 0x02E3BA30>, '__init__': <function __init__ at 0x02E3F3F0>}
即A中含一个dict,其中模块是main,new和init为对应函数对象
class A(object):
def __init__(self):
print dir(self)
print self.__dict__
#self.a = 10
print 'init'
def __new__(cls):
print cls
print 'new'
#self.a = 5
#return object.__new__(cls)
t = A()
进入A(),这里A是<class '__main__.A'>
然后进入new,这里的cls会自动赋值为{type}<class '__main__.A'>,不一定是cls,啥都行,经过new之后,会发现不经过init函数,t是None
然后去掉new中的#,会产生错误,因为在new中,还没有self的存在,去掉这一语句后会进入init函数,执行完init后生成了t
#print t.a
#print t.__dict__
print dir(t)
class B():
def __init__(self):
print self.__dict__
self.a = 20
print 'init'
def __new__(cls):
print 'new'
#return object.__new__(cls)
执行完B之后,发现B和A并不一样,B是B={classobj}__main__.B
生成的b也和t不一样t是{A}<__main__.A object at 0x02C6BCF0>,b是{instance}B: <__main__.B instance at 0x02C44788>,并且没有执行__new__,b的创建,只执行了init
b = B()
print b.a
print dir(b)
#print b.__new__
print getattr(b,'__new__')
执行完后,发现b的dict属性比a的少了很多东西