是否可以全局设置元类,以便它适用于默认创建的所有 类?
Is it possible to set a Metaclass globally so it applies to all classes created by default?
我知道元 class 可以替换类型并定义新创建的 class 的行为方式。
例如:
class NoMixedCase(type):
def __new__(cls,clsname,base,clsdict):
for name in clsdict:
if name.lower() != name:
raise TypeError("Bad name.Don't mix case!")
return super().__new__(cls,clsname,base,clsdict)
class Root(metaclass=NoMixedCase):
pass
class B(Root):
def Foo(self): #type error
pass
但是,有没有一种方法可以全局设置 NoMixedCase,这样每当创建一个新的 class 时,它的行为默认由 NoMixedCase 定义,而不必从 Root 继承?
所以如果你这样做了...
Class B:
def Foo(self):
pass
...它仍然会检查方法名称的大小写。
至于你的问题,不,它不是通常的 - 甚至可能不是一些特别的东西可以解决这个问题 - 许多 CPython 内部的东西都与 type
class,并硬编码到它。
在不立即使解释器崩溃的情况下,可以尝试为 type.__new__
编写包装器并使用 ctypes 直接在 type.__new__
插槽中替换它。 (普通任务不会这样做)。你可能仍然会崩溃。
因此,在现实生活中,如果您决定不按照我在上面的评论中建议的那样使用带有插件和提交挂钩的 linter 程序,那么要走的路就是拥有一个 Base class 使用你的 metaclass,让你项目中的每个人都继承那个 Base。
我知道元 class 可以替换类型并定义新创建的 class 的行为方式。
例如:
class NoMixedCase(type):
def __new__(cls,clsname,base,clsdict):
for name in clsdict:
if name.lower() != name:
raise TypeError("Bad name.Don't mix case!")
return super().__new__(cls,clsname,base,clsdict)
class Root(metaclass=NoMixedCase):
pass
class B(Root):
def Foo(self): #type error
pass
但是,有没有一种方法可以全局设置 NoMixedCase,这样每当创建一个新的 class 时,它的行为默认由 NoMixedCase 定义,而不必从 Root 继承?
所以如果你这样做了...
Class B:
def Foo(self):
pass
...它仍然会检查方法名称的大小写。
至于你的问题,不,它不是通常的 - 甚至可能不是一些特别的东西可以解决这个问题 - 许多 CPython 内部的东西都与 type
class,并硬编码到它。
在不立即使解释器崩溃的情况下,可以尝试为 type.__new__
编写包装器并使用 ctypes 直接在 type.__new__
插槽中替换它。 (普通任务不会这样做)。你可能仍然会崩溃。
因此,在现实生活中,如果您决定不按照我在上面的评论中建议的那样使用带有插件和提交挂钩的 linter 程序,那么要走的路就是拥有一个 Base class 使用你的 metaclass,让你项目中的每个人都继承那个 Base。