在Python中动态创建描述符

时间:2018-11-26 08:58:50

标签: python-3.x

我想知道是否可以在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)

0 个答案:

没有答案