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

この後、記述子インスタンス属性が記述子になり、チェックisinstanceが成功します。

于 2013-06-29T12:57:56.070 に答える