__方法__
:
1 class Dog(object):
2 def __init__(self): #初始化对象
3 print("__init__")
4
5 def __del__(self): #对象销毁时自动调用
6 print("__del__") #死之前说的最后一句话,做的最后一件事
7
8 def __str__(self): #打印对象时输出,相当于Java的toString()
9 return "对象的描述信息"
10
11 def __new__(cls): #创建对象,返回对象的引用
12 print(id(cls))
13 print("__new__")
14 return super().__new__(cls) #object.__new__(cls)
15
16
17 print(id(Dog))
18 xtq = Dog()
# Python解析器看到这句话,会做三件事:
# 1.先调__new__方法(创建对象)
# 2.再调__init__方法(将对象的引用传进去)(初始化对象)
# 3.返回对象的引用。
19 print(xtq)
运行:
22921128
22921128
__new__
__init__
对象的描述信息
__del__
单例模式:
1 class Singleton(object):
2 #类的私有属性
3 __instance = None
4
5 def __new__(cls):
6 if cls.__instance == None: #此刻用cls. 相当于用Singleton. 都是类对象的引用
7 cls.__instance = super().__new__(cls)
8 return cls.__instance
9 else:
10 return cls.__instance
11
12 a = Singleton()
13 b = Singleton()
14 print(id(a))
15 print(id(b))
运行:
140012620405448
140012620405448
Python的构造方法相当于:既调
__new__
方法、又调__init__
方法。
所以在构造的时候传的实参,要同时在__new__
和__init__
方法上申明形参。
如何只初始化一次:
定义一个类属性flag来判断,第一次初始化后改变其值。
1 class Singleton(object):
2 #类的私有属性
3 __instance = None
4 __init_flag = False
5
6 def __new__(cls, new_name):
7 if cls.__instance == None:
8 cls.__instance = super().__new__(cls)
9 return cls.__instance
10 else:
11 return cls.__instance
12
13 def __init__(self, new_name):
14 if Singleton.__init_flag == False:
15 self.name = new_name
16 Singleton.__init_flag = True
17
18
19
20 a = Singleton("旺财")
21 print(id(a))
22 print(a.name)
23
24 b = Singleton("哈士奇")
25 print(id(b))
26 print(b.name)
运行:
140609378646728
旺财
140609378646728
旺财
网友评论