_ init _的用法
class Person(object):
def __init__(self,name,age):
print('__init__')
self.name = name
self.age = age
p = Person('laowang',33)
print(p)
输出结果:
__init__
<__main__.Person object at 0x7fb2e0936450>
实际上,_ init_函数并不是真正意义上的构造函数,init方法的作用是在对象创建好之后初始化变量,真正创建实例的是_ new_ 方法。
_ new_的用法
class Person(object):
def __new__(cls,name,age):
print('__new__用法')
instance = object.__new__(cls)
return instance
def __init__(self,name,age):
print('__init__用法')
self.name =name
self.age = age
p = Person('laowang',33)
print(p.name)
print(p.age)
输出结果:
__new__用法
__init__用法
laowang
33
用_ new_实现单例模式
class Person(object):
__instance = None
__init_flag = False
def __new__(cls):
if cls.__instance == None:
cls.__instance = object.__new__(cls)
return cls.__instance
else:
return cls.__instance
def __init__(self,name,age):
if Persom.__init_flag == False:
self.name =name
self.age = age
Person.__init_flag = True
p1 = Person('laowang',33)
p2 = Person('laozhang',30)
print(p1.name)
print(p2.name)
print(id(p1))
print(id(p2))
输出结果:
laowang
laowang
139736432307000
139736432307000
- 可以看到p1 和 p2 都指向同一个对象,实现了单例模式