基本クラス(Model
)は、メタクラスまたはイントロスペクションを実行するファクトリメソッド(__new__
など)と関連しています。ここで
は、関数(簡単な解決策)を再現することができる方法である:それは空またはNone
ある場合
class Model():
pass
class Column():
def __init__(self, name=None):
self.name = name
def setup_class(cls):
for name, value in cls.__dict__.items():
if isinstance(value, Column):
attr = getattr(cls, name)
attr.name = attr.name or name
このsetup_class
機能は、例えば、CLSクラスおよびセットアップ名属性をイントロスペクト:
class Car(Model):
id = Column()
from pprint import pprint
pprint(Car.id.name)
# -> None
setup_class(Car)
pprint(Car.id.name)
# -> 'id'
編集
メタクラス使用
実装例:もちろん
class Column():
def __init__(self, name=None):
self.name = name
class MyMeta(type):
def __new__(cls, name, bases, attrs):
for name, col in attrs.items():
if isinstance(col, Column):
col.name = col.name or name
return super(MyMeta, cls).__new__(cls, name, bases, attrs)
class Model(metaclass=MyMeta):
pass
class Car(Model):
id = Column()
import pprint
pprint.pprint(Car.id.name)
# -> 'id'
を、それは十分ではありません。 Column
はdescriptorであることを理解する必要があります。この記述子は、SQLクエリを構築するために使用されます。
私はいくつかの魔法が不足していることを知っていました。前にメタクラスに遭遇したことはありませんでした。ありがとうLaurent! – pybot