|
|
发表于 2024-9-21 07:54:29
|
显示全部楼层
本楼为最佳答案
关于魔法方法,仔细看 Python 最新版:74~78集
鱼油代码主要涉及了 __call__、__new__ 和 __init__ 方法的使用和它们之间的交互。
定义 MyType 类:
MyType 继承自 type,它是 Python 中所有新式类的元类。
__new__ 方法:这是一个类方法,用于创建类的新实例。在元类中重写这个方法可以控制类的创建过程。
__init__ 方法:这个方法用于初始化新创建的对象。在元类中,它通常用来设置类级别的属性或者执行类的初始化代码。
__call__ 方法:这个方法使得实例可以像函数一样被调用。在元类中定义,意味着当类的实例(也就是这里的类 Foo)被调用时,会执行这个方法。
在 __call__ 方法中:
先调用 __new__ 方法创建一个空对象。__new__ 是一个静态方法,其目的是创建一个新实例然后返回。
接着调用 __init__ 方法初始化这个新创建的对象。在这个方法里,可以设置对象的属性等。
最后返回这个已初始化的对象。
定义 Foo 类:
Foo 类指定其元类为 MyType。
这意味着创建 Foo 类的实例时,会经过 MyType 中定义的 __call__ 方法。
__init__ 方法用于设置 Foo 实例的 name 属性。
创建 Foo 的实例并使用:
当执行 v1 = Foo('alex') 时,实际上是调用了 MyType 的 __call__ 方法。这个方法先创建了一个 Foo 的实例,然后调用 __init__ 初始化实例。
打印 v1 将调用 Foo 类的 __str__ 方法(这里没有显示重写,所以使用默认的行为)。
打印 v1.name 将输出 "alex",因为在 Foo 的 __init__ 方法中设置了 name 属性。
这种使用元类的方式主要用于在创建类时实现某些自动化的处理,例如自动注册类的实例、添加额外的方法或属性等。 |
|