setattr
例子说明setattr的无限递归错误:
def __setattr__(self, name, value):
self.name = value
# 每一次属性赋值时, __setattr__都会被调用,因此不断调用自身导致无限递归了。
正确写法:
def__setattr__(self, name, value):
self.__dict__[name] = value #self[k]=value
new
new实现单例模式
class Student(object):
instance = None
def __new__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super(Student, cls).__new__(cls, *args, **kwargs)
return cls.instance #类属性不是实例属性,在实例中共享
s1 = Student()
s2 = Student()
s1.value = 20
print(s1, s2)
print(s1.value, s2.value)
print(s1 is s2)
############## 打印结果如下 ##############
<__main__.Student object at 0x1033a1c88> <__main__.Student object at 0x1033a1c88>
20 20
True
with exit
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
pass