最近のプロジェクトでは、次のようなことを試みました (より複雑ですが、結果は同じです)。
class MetaA(type):
def __new__(cls, name, args, kwargs):
print kwargs["foo"]
return type.__new__(cls, name, args, kwargs)
class A(object):
__metaclass__ = MetaA
foo = "bar"
class B(A):
pass
私はこれを得る:
bar
Traceback (most recent call last):
File "C:\Users\Thorstein\Desktop\test.py", line 10, in <module>
class B(A):
File "C:\Users\Thorstein\Desktop\test.py", line 3, in __new__
print kwargs["foo"]
KeyError: 'foo'
クラス属性は継承されませんか? もしそうなら、上記と同様のフレームワークで可能な回避策はありますか?
編集:プログラムの実際の(単純化された)例を使用すると、私が何を意味するのかを理解しやすくなるかもしれません..
class GameObjectMeta(type):
def __new__(cls, name, bases, attrs):
attrs["dark_color"] = darken(*attrs["color"])
return type.__new__(cls, name, bases, attrs)
class GameObject(object):
__metaclass__ = GameObjectMeta
color = (255,255,255) # RGB tuple
class Monster(GameObject):
pass
基本的に、基本色で関数を実行して、クラスに保存されている暗い色を作成します (クラスの複数のインスタンスは同じ色を必要としますが、クラス階層が長くなります)。これがより意味をなすことを願っています..