做网站的可行性分析一键优化大师下载
Python —— 面向对象 —— 特殊且重要的双下方法
双下方法
__new__
创建对象。
__init__
构造方法,使用最多。
__call__
__call__方法的执行有两种情况:
1、对象加括号
未定义__call__,执行 obj() 会报错:TypeError: 'Foo' object is not callable
classFoo():deffunc(self):pass
def __call__(self, *args, **kwargs):return "执行__call__方法"obj=Foo()print(obj())'''执行__call__方法'''
__call__
2、metaclass创建类
metaclass=type,创建类时,会先执行call方法创建类。
__str__
classFoo():def __str__(self):return "Foo的__str__方法"obj=Foo()print(obj)'''Foo的__str__方法'''
__str__
打印一个对象本身 print(obj) ,会调用该对象的__str__方法。
__str__方法的默认返回值为该对象的内存地址,如:"<__main__.foo object at>"。
Django的model中,定义__str__方法,在admin页面中显示的就是该对象的某个字段值,而不是 xxx object。
__getattr__、__setattr__
__getattr__在对象.属性的时候执行
__getitem__、__setitem__
__enter__、__exit__
with所求值的对象必须有一个__enter__()方法,一个__exit__()方法。
classFoo(object):def __enter__(self):print("执行__enter__方法")return "enter"
def __exit__(self, exc_type, exc_val, exc_tb):print("执行__exit__方法")
obj=Foo()
with obj as o:print("o:", o)'''执行__enter__方法
o: enter
执行__exit__方法'''
#未定义__enter__():AttributeError: __enter__#未定义__exit__():AttributeError: __exit__
__enter__、__exit__
执行过程:
with后边的语句被求值,返回对象的__enter__方法被调用,该方法返回值被赋值给as后边的变量。
with语句的代码块被全部执行完后,将调用返回对象的__exit__方法。
__mro__
返回该类的所有
classF4(object):pass
classF3(F4):pass
classF2():pass
classF1(F2, F3):pass
print(F1.__mro__)'''(, , , , )'''
__mro__
classF4(object):pass
classF3(F4):pass
classF2_5():pass
classF2(F2_5):pass
classF1(F2, F3):pass
print(F1.__mro__)'''(, , , , , )'''
__mro__
__slots__
正常情况下,当我们定义了一个class,创建一个class后,可以给改实例绑定任何属性和方法。
给一个实例绑定的方法,另一个实例是不起作用的。给class绑定方法后,所有实例均可调用。
python允许在定义class的时候,定义一个特殊的__slots__变量。来限制该class能添加的属性: __slots__ = ('name', 'age')。
__slots__定义的属性仅对当前类起作用,对继承的子类不起作用。除非在子类中也定义__slots__,子类允许定义的属性就是自身的__slots__加上父类的__slots__
举例:openpyxl.cell.cell.Cell 类