获取描述符类的访问权限

时间:2013-06-29 12:25:02

标签: python numpy descriptor

我使用描述符来强制使用numpy数组。这很好,但现在我想知道一个类的属性是否是Spectrum的实例。我的想法是检查obj.__dict__并使用isinstance(obj, Spectrum)但是,Spectrum.__get__将返回数组,因此isinstance(obj, Spectrum)将失败。有什么方法可以解决这个问题吗?

class Spectrum(object):
    """Class capable of containing spectral values."""

    def __init__(self, name, dtype='float64'):
        self.name = name

    def __get__(self, instance, cls):
        if instance is None:
            return self
        else:
            print instance.__dict__
            return instance.__dict__[self.name]

    def __set__(self, instance, value):
        if not isinstance(value, np.ndarray):
            raise TypeError('Expected an ndarray')
        instance.__dict__[self.name] = value

    def __delete__(self, instance):
        del instance.__dict__[self.name]

class Material(object):
    loss_factor = Spectrum(name='loss_factor', dtype='Float64')

    def __init__(self):
        self.loss_factor = np.array([1, 2, 3])

def main():
    obj = Material()
    print isinstance(obj.loss_factor, Spectrum)

1 个答案:

答案 0 :(得分:0)

您可以尝试获取类变量并进行检查。

cls_attr = getattr(obj.__class__, 'loss_factor', None)
if isinstance(cls_attr, Spectrum):
    pass #TODO something

应该尝试使用有趣的名称获取class属性(我说尝试因为类可以具有或不具有此属性)

如果您尝试使用所有者类__get__方法获取描述符将以None作为实例运行,并且将运行以下代码。

    def __get__(self, instance, cls):
        if instance is None:
            return self

在此之后,将具有描述符实例属性的描述符,并且检查isinstance将成功。