Изменение имени атрибута экземпляра через метаклассPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Изменение имени атрибута экземпляра через метакласс

Сообщение Anonymous »

Мне нужно создать метакласс, который должен добавить префикс «custom_» ко всем свойствам и методам моего класса CustomClass, за исключением магических методов.
Вот код:

Код: Выделить всё

class CustomClass(metaclass=CustomMeta):
x = 50

def __init__(self, val=99):
self.val = val

def line(self):
return 100

def __str__(self):
return "Custom_by_metaclass"
Я написал следующий метакласс, который отлично подходит для этого случая, но столкнулся с проблемой: я не могу изменить аргумент экземпляра self.val на self.custom_val, поэтому мои утверждения не выполняются:< /p>

Код: Выделить всё

inst = CustomClass()
assert inst.custom_val == 99 #Fails
Во всяком случае, другие утверждения подходят:

Код: Выделить всё

assert CustomClass.custom_x == 50
inst = CustomClass()
assert inst.custom_x == 50
assert inst.custom_line() == 100
assert str(inst) == "Custom_by_metaclass"
Вот мой метакласс:

Код: Выделить всё

class CustomMeta(type):

def __new__(cls, name_class, base, attrs):
custom_attrs = {}
for key, value in attrs.items():
if not key.startswith('__') and not key.endswith('__'):
custom_attrs['custom_' + key] = attrs[key]
else:
custom_attrs[key] = attrs[key]
return type.__new__(cls, name_class, base, custom_attrs)
Что мне следует сделать, чтобы справиться с моей проблемой?
PS. Одно из решений — написать setattr в мой CustomClass

Код: Выделить всё

    def __setattr__(cls, name, value):
if not (name.startswith('__') and name.endswith('__')):
name = f'custom_{name}'
super().__setattr__(name, value)
Это работает, и я могу динамически добавлять новые свойства для своего объекта и получать тег custom_. Но есть ли способ решить эту проблему через метакласс?
Задача связана с созданием и метаклассом, поэтому я сомневаюсь, что мое решение соответствует требованиям.

Подробнее здесь: https://stackoverflow.com/questions/791 ... -metaclass
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»