python: искажение имени в динамически созданном классе - PullRequest
0 голосов
/ 17 мая 2018

Я хочу сделать что-то вроде этого

def make_class(name : str)->type:
    class Ret:
       __name__ = name
       def __init__(self):
           self.__x = 0
    return Ret

A = make_class('A')
a = A()
assert a._A__x == 0

По сути, я хочу создать тип, чтобы он обрабатывал свои члены в соответствии с динамическим идентификатором, но приведенный выше пример не работает.Метаклассы тоже не могут.

Единственное решение, которое я могу придумать:

выполнить полное определение класса

exec("""
class {}:
    def __init__(self):
        self.__x = 0
""".format(name))

или установить атрибут через getattr

class Ret:
    def __init__(self):
        setattr(self,'_'+name+"__x",0)

но оба они непривлекательны по разным причинам, есть ли правильный способ сделать это?

1 Ответ

0 голосов
/ 18 мая 2018

Искажение имени Python в основном статично. Это выполняется во время компиляции байт-кода, прежде чем станет доступен аргумент name вашей функции. Для динамического вызова этого механизма вам придется динамически компилировать код, а это значит, что вам придется использовать exec или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...