Python 你能用一个元类做什么;你不喜欢新的吗?

Python 你能用一个元类做什么;你不喜欢新的吗?,python,python-3.x,Python,Python 3.x,在我看来,人们给出的许多元类使用的典型示例中,元类的\uuuu init\uuuu方法以某种方式修改cls参数,可以通过修改类上的\uu new\uuuu来实现 什么是可以通过创建元类而不是修改\uuuuuu new\uuuuuu来完成的一些实际事情?任何涉及类对象初始化方式的事情?编写类定义语句时,class Foo:pass是对type构造函数的隐式调用,type('Foo',(object,),{})。您想要控制该进程的任何事情都必须发生在元类中(通过重写默认元类,type的行为),下面是

在我看来,人们给出的许多元类使用的典型示例中,元类的
\uuuu init\uuuu
方法以某种方式修改
cls
参数,可以通过修改类上的
\uu new\uuuu
来实现


什么是可以通过创建元类而不是修改
\uuuuuu new\uuuuuu
来完成的一些实际事情?

任何涉及类对象初始化方式的事情?编写类定义语句时,
class Foo:pass
是对
type
构造函数的隐式调用,
type('Foo',(object,),{})
。您想要控制该进程的任何事情都必须发生在元类中(通过重写默认元类,
type
的行为),下面是一个示例,假设您想要修改
print(MyClass)
的行为,其中
MyClass
是某个类。那么在
MyClass
的定义中,你真的无能为力,你必须定义一个覆盖
\uuurepr\uuuuu
的元类。或者考虑<代码>枚举< /代码>。这在很大程度上依赖于元类。举一个简单的例子,假设您有一个枚举类型,
Color
,您可以通过迭代类
来迭代枚举中的颜色:
,同样,您必须在metaclass@juanpa.arrivillaga我懂了。谢谢你的例子,这很有道理。我看到的很多例子都是关于类的对象的行为,我想这就是为什么我感到困惑的原因。你几乎可以用元类做任何事情,比如改变属性,改变类的继承,改变类的属性和方法class@wetler对但我刚才说的是,所有这些都可以通过在类中重写
\uuuuu new\uuuu
来实现。上面给出的修改类本身的
\uuuu str\uuuu
的例子是有意义的,但这不是我个人想要做的事情。任何涉及类对象如何初始化的事情?编写类定义语句时,
class Foo:pass
是对
type
构造函数的隐式调用,
type('Foo',(object,),{})
。您想要控制该进程的任何事情都必须发生在元类中(通过重写默认元类,
type
的行为),下面是一个示例,假设您想要修改
print(MyClass)
的行为,其中
MyClass
是某个类。那么在
MyClass
的定义中,你真的无能为力,你必须定义一个覆盖
\uuurepr\uuuuu
的元类。或者考虑<代码>枚举< /代码>。这在很大程度上依赖于元类。举一个简单的例子,假设您有一个枚举类型,
Color
,您可以通过迭代类
来迭代枚举中的颜色:
,同样,您必须在metaclass@juanpa.arrivillaga我懂了。谢谢你的例子,这很有道理。我看到的很多例子都是关于类的对象的行为,我想这就是为什么我感到困惑的原因。你几乎可以用元类做任何事情,比如改变属性,改变类的继承,改变类的属性和方法class@wetler对但我刚才说的是,所有这些都可以通过在类中重写
\uuuuu new\uuuu
来实现。上面给出的修改类本身的
\uuu str\uuu
的示例是有意义的,但我个人并不想这么做。