Вот код:
Код: Выделить всё
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"
Код: Выделить всё
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)
Задача связана с созданием и метаклассом, поэтому я сомневаюсь, что мое решение соответствует требованиям.
Подробнее здесь: https://stackoverflow.com/questions/791 ... -metaclass