クラスがありParent
ます。__new__
forを定義して、インスタンス化時に何らかの魔法を実行するようにしたいと考えてParent
います (理由については、脚注を参照してください)。また、子クラスがこのクラスや他のクラスから継承して、親の機能を取得するようにしたいと考えています。は、子クラスのベースとクラスのサブクラスのインスタンスを返しParent
ます。__new__
Parent
子クラスは次のように定義されます。
class Child(Parent, list):
pass
__new__
しかし、今では何を呼び出すべきかわかりませParent
ん__new__
。を呼び出すobject.__new__
と、上記のChild
例では を呼び出す必要があると不平を言いlist.__new__
ます。しかし、どうやってそれをParent
知ることができますか? すべての をループし、ブロック内で__bases__
それぞれを呼び出すように機能させました。__new__
try:
class Parent(object):
def __new__(cls, *args, **kwargs):
# There is a special wrapper function for instantiating instances of children
# classes that passes in a 'bases' argument, which is the __bases__ of the
# Children class.
bases = kwargs.get('bases')
if bases:
cls = type('name', bases + (cls,), kwargs.get('attr', {}))
for base in cls.__mro__:
if base not in (cls, MyMainType):
try:
obj = base.__new__(cls)
break
except TypeError:
pass
return obj
return object.__new__(cls)
しかし、これはハックのように見えます。確かに、これを行うためのより良い方法があるはずですか?
ありがとう。
- 私が使用したい理由は、クラスに割り当てられたいくつかの動的属性 (魔法の属性など)
__new__
を持つサブクラスのオブジェクトを返すことができるようにするためです。__int__
でこれを行うこと__init__
self.__class__
もできましたが、新しいクラスの内部構造が異なる場合は変更できません__init__
。ここでは、多重継承が原因です。