2

キャッシュ/永続性の理由から、基本クラスのサブクラスの任意に大きなツリー (それ自体は作成されません) の一意のハッシュ可能なアドレスを取得しようとしています。現時点での様子は次のとおりです。

OBJECT_CACHE = dict()

class Base(object):
    def __new__(cls, *args, **kwargs):
        # calculate class_addr here?
        obj = OBJECT_CACHE.get(class_addr)
        if obj is None:
            obj = super(Base, cls).__new__(cls, *args, **kwargs)
            OBJECT_CACHE[class_addr] = obj
        return obj

しかし、そのようなIDを取得するための最良の方法が何であるかはわかりません。私のコンセプトは、次のようになるということです。

Base:          # no id
    F          # id = 'f'
    A:         # id = 'a'
        E      # id = 'a.e'
        B:     # id = 'a.b'
            C  # id = 'a.b.c'
            D  # id = 'a.b.d'

プロパティで何かを試してみることを考えましsuper()たが、理想的には、サブクラスにはmy_id = 'e'. 前もって感謝します!

4

1 に答える 1

2

あなたが探しているのはcls.mro()です:

OBJECT_CACHE = dict()
class Base(object):
    def __new__(cls, *args, **kwargs):
        class_addr = cls.name()
        obj = OBJECT_CACHE.get(class_addr)
        if obj is None:
            obj = super(Base, cls).__new__(cls, *args, **kwargs)
            OBJECT_CACHE[class_addr] = obj
        return obj
    @classmethod
    def name(cls):
        names = [k.__name__.lower() for k in cls.mro() 
                if k != Base and issubclass(k, Base)]
        return '.'.join(names[::-1])


class F(Base): pass
class A(Base): pass
class E(A): pass
class B(A): pass
class C(B): pass
f = F()
a = A()
e = E()
b = B()
c = C()
print(OBJECT_CACHE.keys())

収量

['a', 'a.e', 'a.b.c', 'a.b', 'f']
于 2013-03-17T17:21:14.013 に答える