使用基于对象变量的描述符动态创建类



我想动态地(在运行时(创建一个python类,该类模仿类,但将vars更改为描述符。

例如,如果我有:

class base:
pass
def get_custom_class(obj):
pass #need to do something here, return a class with descriptors for vars(obj)
t = base()
t.a = 1
t.b = '2'
vars(t) # {'a': 1, 'b': '2'}
custom_t = get_custom_class(t)
custom_t.a #calls a descriptor.__get__ in custom_t's class that gets t.a
custom_t.b = '3' #calls a descriptor.__set__ that set's t.a (and will check type).
t.b    #'3'

我需要在get_custom_class中做一些事情,动态地创建一个具有所需描述符的<class 'type'>,然后实例化它一次,以返回一个具有描述符属性的对象(使用最新的Python(。

您可以使用type(name, bases, attrs)创建具有attrs属性的类。然后,您可以根据需要实例化这个类;您需要实例化它以使描述符发挥作用。因此,诀窍就是用变量的键和描述符对象的值填充dict。

class your_custom_descriptor:
def __init__(self, obj, var):
self._obj = obj
self._var = var
def __get__(self, o, otype=None):
print(f'in __get__ {self._obj}.{self._var}={self._obj.__dict__[self._var]}')
return self._obj.__dict__[self._var]
def __set__(self, o, value):
self._obj.__dict__[self._var] = value
print(f'in __set__ {self._obj}.{self._var}={self._obj.__dict__[self._var]}')

class base:
pass
def get_custom_class(your_orig_obj):
attrs = dict()
for var in vars(your_orig_obj):
attrs[var]=your_custom_descriptor(your_orig_obj, var)
custom_class = type('custom_class', (object, ), attrs)
return custom_class()
t = base()
t.a = 1
t.b = '2'
r = base()
r.c = 'a'
print(vars(t)) # {'a': 1, 'b': '2'}
print(vars(r))
custom_t = get_custom_class(t)
custom_r = get_custom_class(r)
print(custom_t.a) #calls a descriptor.__get__ in custom_t's class that gets t.a
custom_t.b = '3' #calls a descriptor.__set__ that set's t.a (and will check type).
print(t.b)    #'3'
print(custom_r.c)
print(custom_r.a) #AttributeError, r didn't have an attribute a so custom_r doesn't

最新更新