1.init和new方法区别
init初始化方法
new构造方法(先构造出来,才能初始化)
2.实例化一个方法都发生了什么?
1开辟一个属于对象的空间,new方法
2把对象的空间传给self,同时调用init方法
3将这个对象的空间返回给调用者
3 new构造方法
new构造方法在什么时候执行:在实例化对象之后,在init初始化之前。
代码块
class Single:
def __new__(cls, *args, **kwargs):
obj=object.__new__(cls)
print('在new方法里面',obj)
return obj
def __init__(self):
print('在init方法里面',self)
a=Single()
输出结果:
在new方法里面 <__main__.Single object at 0x009E8E90>
在init方法里面 <__main__.Single object at 0x009E8E90>
4单例类
定义:
如果一个类 从头到尾只能有一个实例,说明从头到尾之开辟了一块儿属于对象的空间,那么这个类就是一个单例类
代码块:不是单例类的例子
class Student:
print('hello')
a=Student()
b=Student()
c=Student()
print(a,b,c)
#因为a,b,c三个的空间地址不一样,所以不是单例类,
# 单例类是一个类只能由一个实例化的对象
通过__ISINSTANCE=None来控制只能创造一个构造空间,无论实例化多少对象,后面都会把前面的覆盖,永远只有一开始创建的那个内存空间,这就是单例类的实现。
代码块:单例类的例子
class A:
__ISINCTANCE = None
def __new__(cls, *args, **kwargs):
if not cls.__ISINCTANCE:
cls.__ISINCTANCE = object.__new__(cls)
return cls.__ISINCTANCE
def __init__(self,name):
self.name = name
print(self)
a=A('wangsiyu') #<__main__.A object at 0x014E8ED0>
b=A('mayun') #<__main__.A object at 0x014E8ED0>
print(b.name) #mayun
print(a.name) #mayun
print(a,b) # <__main__.A object at 0x014E8ED0> <__main__.A object at 0x014E8ED0>
如果换成__ISINSTANCE=True,判断条件再把not去掉,就没有用了。
就无法用__ISINSTANCE=None来限制创造构造空间的数量了
代码块
class A:
__ISINCTANCE = True
def __new__(cls, *args, **kwargs):
if cls.__ISINCTANCE:
cls.__ISINCTANCE = object.__new__(cls)
return cls.__ISINCTANCE
def __init__(self,name):
self.name = name
print(self)
a=A('wangsiyu') #<__main__.A object at 0x014E8ED0>
b=A('mayun') #<__main__.A object at 0x014E8ED0>
print(b.name) #mayun
print(a.name==b.name) #False
5__str__方法
代码块
class Student:
def __str__(self):
return '%s %s %s'%(self.school,self.cls,self.name)
def __init__(self,name,stu_cls):
self.school = 'oldboy'
self.name = name
self.cls = stu_cls
a=Student('wangsiyu','ec14')
print(a) #oldboy ec14 wangsiyu
print一个对象相当于调用一个对象的str方法
str(obj),相当于执行obj.str方法
'%s'%obj,相当于执行obj.str方法
网友评论