我得到一个元类可以代替类型并定义新创建的类的行为。
ex:
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的方法,因此,每次创建新类时,默认情况下NoMixedCase都会定义其行为,而不必继承自Root?
所以,如果您这样做...
Class B:
def Foo(self):
pass
...它仍然会检查方法名称的大小写。
关于您的问题,不,它不是通常的-甚至可能不是非常适合的方法-许多CPython的内部事物都与type
类相关联,并对其进行了硬编码。
尝试在不立即使解释器崩溃的情况下,可能要做的是为type.__new__
写一个包装程序,并使用ctypes直接在type.__new__
插槽中替换它。 (普通作业不会这样做)。您可能仍然会崩溃。
因此,在现实生活中,如果您决定不像上面的注释中所建议的那样,通过带有插件和提交钩子的linter程序进行操作,则方法是拥有一个使用您的元类的基类,并且让项目中的每个人都可以从该Base继承。