1

サブクラスごとにのみ計算できる計算値にアクセスする必要があるクラスがあります。この計算は安くはありません。サブクラスのインスタンス化が多いため、この値をサブクラスごとに1回だけ計算したいと思います。

私は本当に好きではない2つの解決策を考えることができます:

どちらの親クラスにも@classmethod start()、値を計算するがあります。これにより、各クラスの最初のインスタンス化の正確な場所を特定する必要があるため、このオプションを除外しました。

または、このコード:

class A(object):
    @classmethod
    def _set_cls_attribute(cls):
        if hasattr(cls, 'big_attr'):
            return
        cls.big_attr = heavy_func(cls.VAL)

    def __init__(self):
        self._set_cls_attribute()

class B(A):
        VAL = 'b'

class C(A):
        VAL = 'c'


for _ in range(large_number):
        b = B()
        c = C()

でも使うのは好きじゃないhasattr…もっといいものはありますか?

4

2 に答える 2

1

メタクラスまたは hasattr なし:

class A(object):
   @classmethod
   def attribute(cls):
       v = heavy_func(cls.VAL)
       cls.attribute = lambda k : v
       return v
于 2013-03-07T14:49:21.323 に答える
1

メタクラスはこれを解決する便利な方法です

class A_meta(type):
    def __init__(cls, *args):
        type.__init__(cls, *args)
        if hasattr(cls, 'VAL'):
            cls.big_attr = heavy_func(cls.VAL)

class A(object):
    __metaclass__ = A_meta

class B(A):
        VAL = 'b'

class C(A):
        VAL = 'c'

あなたと同じ路線に沿った別の方法。これには、属性が最初にアクセスされるまで、heavy_func への呼び出しを遅らせるという利点があります。

class A(object):
    def __getattr__(self, attr):
        if attr == 'big_attr':
            self.__class__.big_attr = heavy_func(self.VAL)
        return object.__getattribute__(self, attr)
于 2013-03-07T14:46:08.967 に答える