setattr

例子说明setattr的无限递归错误:

  1. def __setattr__(self, name, value):
  2. self.name = value
  3. # 每一次属性赋值时, __setattr__都会被调用,因此不断调用自身导致无限递归了。
  4. 正确写法:
  5. def__setattr__(self, name, value):
  6. self.__dict__[name] = value #self[k]=value

new

new实现单例模式

  1. class Student(object):
  2. instance = None
  3. def __new__(cls, *args, **kwargs):
  4. if cls.instance is None:
  5. cls.instance = super(Student, cls).__new__(cls, *args, **kwargs)
  6. return cls.instance #类属性不是实例属性,在实例中共享
  7. s1 = Student()
  8. s2 = Student()
  9. s1.value = 20
  10. print(s1, s2)
  11. print(s1.value, s2.value)
  12. print(s1 is s2)
  13. ############## 打印结果如下 ##############
  14. <__main__.Student object at 0x1033a1c88> <__main__.Student object at 0x1033a1c88>
  15. 20 20
  16. True

with exit

  1. def __enter__(self):
  2. return self
  3. def __exit__(self, exc_type, exc_val, exc_tb):
  4. pass