Можно ли установить метакласс глобально, чтобы он применялся ко всем классам, созданным по умолчанию? - PullRequest
0 голосов
/ 17 марта 2020

Я получаю, что метакласс можно заменить типом и определить, как ведет себя вновь созданный класс.

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

... он по-прежнему проверяет регистр имен методов.

1 Ответ

1 голос
/ 17 марта 2020

Что касается вашего вопроса, нет, это не обычно - и, возможно, даже не какие-то необычные вещи, которые будут работать для этого - многие внутренние вещи CPythons привязаны к классу type и жестко закодированы к нему ,

Что можно попытаться без немедленного сбоя интерпретатора, так это написать оболочку для type.__new__ и использовать ctypes для ее замены непосредственно в слоте type.__new__. (Обычное задание этого не сделает). Вы, вероятно, по-прежнему любите sh вещей.

Итак, в реальной жизни, если вы решите не go с помощью программы linter с плагином и фиксаторами хуков, как я предложил в комментарии выше способ go состоит в том, чтобы иметь базовый класс, который использует ваш метакласс, и заставить всех в вашем проекте наследовать от этой базы.

...