我想知道是否可以在Python中动态创建描述符。到目前为止,我所学的是几何课。此类包含由kwargs初始化的几何参数。为了确保只允许选择一部分参数,存在一个变量“ validKeys”。现在,我希望所有这些属性都成为“值”类型的描述符,为此我实现了相应的描述符类。原因是每次设置属性时,都会调用函数checkGeometry。如果我没有通过描述符解决这个问题,那么我需要为这些属性中的每个属性实现一个不符合DRY策略的属性。
内置函数exec不是我想要的,因为在调用exec(npole=Value())
时不会调用 set_name 键函数。有谁知道为什么?而且,有没有人对我想做的事情有解决方案。
换句话说:为kwargs列表中的每个项目初始化一个描述符。
提前感谢您的帮助!
关于帕斯卡
class Value:
def __get__(self, instance, owner):
return instance.__dict__[self.name]
def __set__(self, instance, value):
instance.__dict__[self.name] = value
if set(instance.__dict__.keys())==set(instance.__class__.validKeys):
if not instance.checkGeometry():
warnings.warn("The bearings geometry has a conflicting setup", Warning)
def __set_name__(self, owner, name):
self.name = name
class Geometry:
validKeys = ['npole','Rri','Rro','Rsi','Rso','wp','s0','depth','hc','wc','dIns','dWire']
npole = Value()
Rri = Value()
Rro = Value()
Rsi = Value()
Rso = Value()
wp = Value()
s0 = Value()
depth = Value()
hc = Value()
wc = Value()
dIns = Value()
dWire = Value()
def __init__(self, **kwargs):
for key, value in kwargs.items():
if key in __class__.validKeys:
self.__setattr__(key,value)