gpt4 book ai didi

python - 以编程方式定义类 : type vs types. new_class

转载 作者:太空狗 更新时间:2023-10-29 21:56:18 27 4
gpt4 key购买 nike

除了 types.new_class 在创建类时定义关键字参数的能力。这两种方法之间有什么主要区别吗?

import types

First = type('First',(object,),{'asd':99})
k = First()

Second = types.new_class('Second',(object,),{},lambda x:x)
x = Second()

最佳答案

这两种方法之间有什么主要区别吗?

。答案涉及一个名为“metaclasses”的概念。

[Metaclasses] are deeper magic than 99% of users shouldever worry about. If you wonder whether you need them, you don't (thepeople who actually need them know with certainty that they need them, anddon't need an explanation about why). ⸺ Tim Peters, author of Zen of Python (source)

如果您认为自己属于那 99%,那么请不要继续阅读,请随意使用 type .和types.new_class一样好除非在极少数情况下使用元类。

如果您想了解有关元类的更多信息,我建议您查看发布到“What are metaclasses in Python?”的一些高质量答案。(我推荐this one。)

一旦您理解了什么是元类,答案就不言自明了。由于 type 是一个特定的元类,它只有在您想要创建将其用作元类的类时才有效。

但是,如果你想使用一个非默认的元类

class MySimpleMeta(type):
pass

静态类不行

class MyStaticClass(object, metaclass=MySimpleMeta):
pass

然后你可以使用types.new_class

import types

MyStaticClass = types.new_class("MyStaticClass", (object,), {"metaclass": MySimpleMeta}, lambda ns: ns)
# this is equivalent to the above class.

(顺便说一句,它需要可调用(例如 lambda ns: ns)而不是字典的原因是 because metaclasses are allowed to care about the order in which the attributes are defined. )

关于python - 以编程方式定义类 : type vs types. new_class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41215107/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com