如果MyMeta是Python3.x中的MyClass元类,MyMeta可以对MyClass执行哪些类型的操作?
我们的目标是将Python元类与其他语言的元编程系统(如Groovy、Xtend、Nemerle、CLOS、OpenJava、BSJ(BackStage Java)、Iguana/J、Scala、Cyan等)进行比较 假设类MyMeta是类MyClass的元类 MyMeta能否在MyClass中生成截获get和MyClass实例属性集的代码 当MyClass被继承时,是否可以调用MyMeta的方法,即使子类元类不是MyMeta 当MyClass方法在子类中被重写时,即使子类元类不是MyMeta,也可以调用MyMeta的方法吗 当MyClass的方法使用尚未声明的属性时,是否可以调用MyMeta的方法 MyMeta能否处理MyClass的AST或其他等效表示? 例如,MyMeta是否可以检查每个类方法最多有20条语句?还是在第二个施工方案后添加一个施工方案?或者重命名一个方法 MyMeta能否在MyClass中生成截取get和get集合的代码 MyClass实例属性 对。这可以通过在类中注入如果MyMeta是Python3.x中的MyClass元类,MyMeta可以对MyClass执行哪些类型的操作?,python,reflection,metaprogramming,metaclass,Python,Reflection,Metaprogramming,Metaclass,我们的目标是将Python元类与其他语言的元编程系统(如Groovy、Xtend、Nemerle、CLOS、OpenJava、BSJ(BackStage Java)、Iguana/J、Scala、Cyan等)进行比较 假设类MyMeta是类MyClass的元类 MyMeta能否在MyClass中生成截获get和MyClass实例属性集的代码 当MyClass被继承时,是否可以调用MyMeta的方法,即使子类元类不是MyMeta 当MyClass方法在子类中被重写时,即使子类元类不是MyMeta,
\uuuu getattribute\uuuuuu
和\uuuuuuuu setattr\uuuuuu
方法来实现。但是,如果属性是以其他形式声明的(比如,使用注释),它还可以为每个属性创建描述符,以仅处理对这些属性的更改。但是,如果这些“实例属性”只是以经典的方式定义的,即在类“\uuuuuu init\uuuuuuu
内的代码中设置的,那么它就不能简单地猜测出它们是什么(但第一种方法无论如何都涵盖了所有属性)
在继承MyClass时是否可以调用MyMeta的方法,即使
子类元类不是MyMeta
子类将自动继承MyMeta作为其元类。如果由于其他基而发生冲突,那么当使用多重继承、拥有其他元类时,根本无法创建子类。(除非创建一个从两个元类继承的合适元类,即)_TL;医生:是的。不,没有子类的元类与其父类的元类不同 当MyClass方法被重写时,是否可以调用MyMeta的方法 在子类中,即使子类元类不是MyMeta 没有“子类的元类不是MyMeta”这样的事情。然后, 元类作用于子类的创建,可以检测方法重写。而且,甚至可以在创建类后通过monkey补丁检测方法重写(通过让元类实现
\uuuu setattr\uuu
)
当MyClass的方法使用
尚未声明的属性
是的,通过设置合适的\uuuuu getattribute\uuuu
和\uuuuu setattr\uuuuu
方法,如前所述。这方面没有现成的功能(也不需要元类,只需实现两种方法的mixin就可以了)
MyMeta可以处理MyClass的AST或其他等效程序吗
代表权?例如,MyMeta可以检查每个类方法是否具有
最多20份声明?或者在第二个方法之后添加语句
陈述或者重命名一个方法
在AST被创建并烘焙成字节码之后,元类被调用。但它可以对字节码方法进行内省,以检查它想要的任何东西,它可以获取它们的源代码(如果可用),并重新生成AST,它还可以重新创建其他方法来替换原来的方法——具有全新字节码的替代方法。
然而,如果曾经使用过的话,这类东西是很少的,而且听起来像是矫枉过正
一种更具python风格的方法是使用decorators,并使用元类在方法上自动应用decorators。如果需要,这些装饰器可以提供包装器函数来运行每个方法的前序和后调用代码
MyMeta能否在MyClass中生成截取get和get集合的代码
MyClass实例属性
对。这可以通过在类中注入\uuuu getattribute\uuuuuu
和\uuuuuuuu setattr\uuuuuu
方法来实现。但是,如果属性是以其他形式声明的(比如,使用注释),它还可以为每个属性创建描述符,以仅处理对这些属性的更改。但是,如果这些“实例属性”只是以经典的方式定义的,即在类“\uuuuuu init\uuuuuuu
内的代码中设置的,那么它就不能简单地猜测出它们是什么(但第一种方法无论如何都涵盖了所有属性)
在继承MyClass时是否可以调用MyMeta的方法,即使
子类元类不是MyMeta
子类将自动继承MyMeta作为其元类。如果由于其他基而发生冲突,那么当使用多重继承、拥有其他元类时,根本无法创建子类。(除非创建一个从两个元类继承的合适元类,即)_TL;医生:是的。不,没有子类的元类与其父类的元类不同 当MyClass方法被重写时,是否可以调用MyMeta的方法 在子类中,即使子类元类不是MyMeta 没有“子类的元类不是MyMeta”这样的事情。然后, 元类作用于子类的创建,可以检测方法重写。而且,甚至可以在创建类后通过monkey补丁检测方法重写(通过让元类实现
\uuuu setattr\uuu
)
当MyClass的方法使用
尚未声明的属性
是的,通过设置合适的\uuuuu getattribute\uuuu
和\uuuuu setattr\uuuuu
方法,如前所述。这方面没有现成的功能(也不需要元类,只需实现两种方法的mixin就可以了)
我能帮你吗