是否可以全局设置元类,使其适用于默认创建的所有类?

问题描述 投票:0回答:1

我得到一个元类可以代替类型并定义新创建的类的行为。

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

...它仍然会检查方法名称的大小写。

python-3.x class metaclass
1个回答
0
投票

关于您的问题,不,它不是通常的-甚至可能不是非常适合的方法-许多CPython的内部事物都与type类相关联,并对其进行了硬编码。

尝试在不立即使解释器崩溃的情况下,可能要做的是为type.__new__写一个包装程序,并使用ctypes直接在type.__new__插槽中替换它。 (普通作业不会这样做)。您可能仍然会崩溃。

因此,在现实生活中,如果您决定不像上面的注释中所建议的那样,通过带有插件和提交钩子的linter程序进行操作,则方法是拥有一个使用您的元类的基类,并且让项目中的每个人都可以从该Base继承。

© www.soinside.com 2019 - 2024. All rights reserved.