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__方法
'''
__call__

2、metaclass创建类

metaclass=type,创建类时,会先执行call方法创建类。

__str__

class Foo():
    def __str__(self):
        return "Foo的__str__方法"


obj = Foo()
print(obj)

'''
Foo的__str__方法
'''
__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__
__enter__、__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'>)
'''
__mro__
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'>)
'''
__mro__

__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 类

 

posted @ 2020-10-10 10:32  乖巧Clare  阅读(133)  评论(0编辑  收藏  举报