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