class X
独自のメタクラスを持つクラスから派生したaがありますMeta
。また、SQLAlchemyの宣言型ベースからXを導出したいと思います。しかし、私は単純なことはできません
def class MyBase(metaclass = Meta):
#...
def class X(declarative_base(), MyBase):
#...
メタクラスの競合エラーが発生するため、「派生クラスのメタクラスは、そのすべてのベースのメタクラスの(厳密ではない)サブクラスである必要があります」。Metaと、宣言型ベースが使用するメタクラス(DeclarativeMetaだと思いますか?)の両方から派生する新しいメタクラスを作成する必要があることを理解しています。だから、書くだけで十分です:
def class NewMeta(Meta, DeclarativeMeta): pass
def class MyBase(metaclass = NewMeta):
#...
def class X(declarative_base(), MyBase):
#...
私はこれを試しましたが、うまくいくようです。しかし、私はこのコードに何らかの問題を引き起こしたのではないかと心配しています。
マニュアルを読みましたが、少しわかりにくいです。何ですか
編集:
私のクラスに使用されるコードは次のとおりです。
class IterRegistry(type):
def __new__(cls, name, bases, attr):
attr['_registry'] = {}
attr['_frozen'] = False
print(name, bases)
print(type(cls))
return type.__new__(cls, name, bases, attr)
def __iter__(cls):
return iter(cls._registry.values())
class SQLEnumMeta(IterRegistry, DeclarativeMeta): pass
class EnumType(metaclass = IterRegistry):
def __init__(self, token):
if hasattr(self, 'token'):
return
self.token = token
self.id = len(type(self)._registry)
type(self)._registry[token] = self
def __new__(cls, token):
if token in cls._registry:
return cls._registry[token]
else:
if cls._frozen:
raise TypeError('No more instances allowed')
else:
return object.__new__(cls)
@classmethod
def freeze(cls):
cls._frozen = True
def __repr__(self):
return self.token
@classmethod
def instance(cls, token):
return cls._registry[token]
class C1(Base, EnumType, metaclass = SQLEnumMeta):
__tablename__ = 'c1'
#...