python类内部 "__*__" 方法的作用

#本文是慕课网《Python项目实战-核心技术进阶训练篇》的学习笔记



__new__()

本身是一个类方法,先于__init__()执行,返回一个实例,可以改变实例化行为

[python]  view plain  copy
  1. class MyClass(tuple):  
  2.     def __new__(cls, *args):  
  3.         a = [x for x in args]  
  4.         return super(MyClass, cls).__new__(cls, a)  
  5.   
  6.     def __init__(self, *args):  
  7.         print self  #>> (1, 2,3)  
  8.         super(MyClass, self).__init__(*args)  
  9.   
  10.   
  11. m = MyClass(123)  
  12. print m  #>> (1, 2,3)  


__dict__

实例属性,用于动态绑定实例属性

[python]  view plain  copy
  1. class MyClass(object):  
  2.     def __init__(self, a, b):  
  3.         self.a = a  
  4.         self.b = b  
  5.   
  6.   
  7. m = MyClass(12)  
  8. print m.__dict__ #{'a': 1, 'b': 2}  
  9.   
  10. m.c = 3  
  11. print m.__dict__  #{'a': 1, 'b': 2, 'c': 3}  
  12.   
  13. m.__dict__["d"] = 4  
  14. print m.d  # 4  


__slots__

类属型,用于解决动态属性绑定占用内存的问题,需提前声明类属性且不可变更

[python]  view plain  copy
  1. class MyClass1(object):  
  2.     __slots__ = ['a''b']  
  3.   
  4.     def __init__(self, a, b):  
  5.         self.a = a  
  6.         self.b = b  
  7.   
  8. m1 = MyClass1(12)  
  9. print m1.a, m1.b #1 2  
  10.   
  11. m1.c = 3 #raise AttributeError  


__enter__() and __exit__()

实例方法,用于使实例支持上下文管理(with as).

前者在开始时调用必须返回实例对象self,

后者在结束或者产生错误时调用,__exit__()的参数中exc_type, exc_value, traceback用于描述异常

[html]  view plain  copy
  1. class MyClass(object):  
  2.     def __enter__(self):  
  3.         self.f = open('test.txt', 'w')  
  4.         return self  
  5.   
  6.     def pname(self):  
  7.         print self.f.name  
  8.   
  9.     def for_read(self):  
  10.         raise AttributeError("f could only wirte")  
  11.   
  12.     def __exit__(self, exc_type, exc_val, exc_tb):  
  13.         print "in exit()"  
  14.         self.f.close()  
  15.   
  16.   
  17. with MyClass() as m:  
  18.     m.pname()   
  19. """  
  20. test.txt  
  21. in eixt()  
  22. """  
  23. with MyClass() as n:  
  24.     n.for_read()  
  25. """  
  26. in eixt()  
  27. AttributeError:f could only write  
  28. """  
  29.    




property()

内置工厂函数,用于类内部设置可管理属性

[python]  view plain  copy
  1. property(fget, fset, fdel)  




__lt__()  __le__()  __gt__()  __ge__()  __eq__()  __ne__()

     <                           <=                   >                      >=                             =                     !=

可以实现类之间的大小比较

另有functools.total_ordering可以只定义等于和大于(或小于)就可以比较全部符号

from functools import total_ordering

[python]  view plain  copy
  1. from functools import total_ordering  
  2.  
  3. @total_ordering  
  4. class Rect(object):  
  5.     def __init__(self, length, width):  
  6.         self.lenght = length  
  7.         self.width = width  
  8.   
  9.     def area(self):  
  10.         return self.lenght * self.width  
  11.   
  12.     def __lt__(self, obj):  
  13.         return self.area() < obj.area()  
  14.   
  15.     def __eq__(self, obj):  
  16.         return self.area() == obj.area()  
  17.   
  18.   
  19. r1 = Rect(12)  
  20. r2 = Rect(14)  
  21.   
  22. print r1 > r2 #False  

__del__()

实例方法,用于在python垃圾回收机制回收变量时执行

[python]  view plain  copy
  1. class MyClass(object):  
  2.     def __del__(self):  
  3.         print 'in __del__'  
  4.   
  5. c = MyClass()  
  6. c = 4 #in __del__  

你可能感兴趣的:(Python综合)