1 __new__方法 创建对象
实质是:调用父类的__new__方法创建的对象
class Dog(object): def __init__(self): print("---init方法") def __str__(self): print("---str方法") def __del__(self): print("---init方法") def __new__(cls): print("---new方法") dog1 = Dog()
---new方法 #只是创建了类对象,没有初始化,没有实例化对象
2)版本2: cls此时是Dog指向的那个类对象
class Dog(object): def __init__(self): print("---init方法") def __str__(self): print("---str方法") def __del__(self): print("---init方法") def __new__(cls): print("---new方法") print(id(cls)) print(id(Dog)) dog1 = Dog()
38097176
---new方法
38097176
3)版本3:调用 被重写的方法__new__ 创建对象
class Dog(object): def __init__(self): print("---init方法") def __str__(self): print("---str方法") def __del__(self): print("---del方法") def __new__(cls): print("---new方法") #对父类的方法重写 # print(id(cls)) object.__new__(cls) #继续调用 被重写的方法 创建对象 #print(id(Dog)) dog1 = Dog()
---new方法
---del方法 #没有执行初始化
4)版本4 __init__ 只负责初始化
class Dog(object): def __init__(self): print("---init方法") def __str__(self): print("---str方法") def __del__(self): print("---del方法") def __new__(cls): #cls此时是Dog指向的那个类对象 print("---new方法") # print(id(cls)) return object.__new__(cls) #print(id(Dog)) dog1 = Dog()
---new方法 ---init方法 ---del方法
5)版本5:优化版
class Dog(object): #初始化 对象一创建开始执行 def __init__(self): print("---init方法") def __str__(self): print("---str方法") return "返回对象的描述信息" #对象内存销毁时执行 def __del__(self): print("---del方法") #通过父类的__new__方法创建对象 def __new__(cls): #cls此时是Dog指向的那个类对象 print("---new方法") # print(id(cls)) return object.__new__(cls) #print(id(Dog)) dog1 = Dog()
相当于做了3件事情 1.调用__new__方法来创建对象,然后找了一个变量来接受__new__的返回值,这个返回值表示创建出来的对象的引用 2. __init__(刚刚创建出来的对象的引用) 3. 返回对象的引用
构造方法
__new__只负责创建 __init__ 只负责初始化 __new__ 和 __init__相当于C语言的构造方法
2. 创建单例对象
1)什么是单例
class Dog(object): pass dog1 = Dog() dog2 = Dog() print(id(dog1)) print(id(dog2))
139888234067784 #不是同一块内存 不是同一个对象 139888234068008
2)版本2:
class Dog(object): def __new__(cls): if xxx : return object.__new__(cls) else: return 上一次创建的对象的引用 dog1 = Dog() dog2 = Dog()
3)版本3:flag标志
class Dog(object): __flag = 0 def __new__(cls): if flag == 0: flag = 1 return object.__new__(cls) else: xxxxx dog1 = Dog() dog2 = Dog()
4)版本4:类属性 实现
class Dog(object): __flag = 0 #类属性 当做标志位 类属性是公有的 __instance = 0 #类属性 存储 上一次创建对象的引用 def __new__(cls): #这是一个类方法,cls指向类对象cls if cls.__flag == 0: cls.__flag = 1 cls.__instance = object.__new__(cls) return cls.__instance else: return cls.__instance dog1 = Dog() dog2 = Dog()
#类方法 @classmethod def add_num(cls): #cls指向类对象 cls.num += 1
#实例方法 def __init__(self,new_name): self.name = new_name #self.name 是实例属性 ,实例对象独有的 #对类属性 +1 Dog.num += 1
5)版本5:__instance = None
class Dog(object): __instance = None def __new__(cls): if cls.__instance == None: cls.__instance = object.__new__(cls) return cls.__instance else: return cls.__instance dog1 = Dog() dog2 = Dog()
6)版本6:查看对应的内存id
class Dog(object): __instance = None def __new__(cls): if cls.__instance == None: cls.__instance = object.__new__(cls) return cls.__instance else: return cls.__instance dog1 = Dog() dog2 = Dog() print(dog1) print(dog2)
python@ubuntu:~/pythonS6/python基础092$ python3 08-单例对象.py <__main__.Dog object at 0x7f46d4584828> <__main__.Dog object at 0x7f46d4584828>
7)版本7:只初始化一次对象
class Dog(object): __instance = None def __new__(cls,name): if cls.__instance == None: cls.__instance = object.__new__(cls) return cls.__instance else: return cls.__instance def __init__(self,new_name): self.name = new_name dog1 = Dog("tom") #单例对象 name='tom' print(id(dog1)) print(dog1.name) dog2 = Dog("jack") #同一对象 令name='jack' print(id(dog2)) print(dog2.name)
140546425677920 tom 140546425677920 jack #如何让对象都是tom
8)版本8:添加flag
class Dog(object): __instance = None __flag = False def __new__(cls,name): if cls.__instance == None: cls.__instance = object.__new__(cls) return cls.__instance else: return cls.__instance def __init__(self,new_name): if Dog.__flag == False: self.name = new_name Dog.__flag = True dog1 = Dog("tom") print(id(dog1)) print(dog1.name) #对象里面name = “tom” dog2 = Dog("jack") print(id(dog2)) print(dog2.name)
139813073586272 tom 139813073586272 tom #只初始化了一次对象