1

我使用描述符来强制使用 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)
4

1 回答 1

0

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

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

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

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

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

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

于 2013-06-29T12:57:56.070 回答