私のプロジェクトでは、のオブジェクトobj
を生成します。実行時に、ユーザーが何をしたいか、オブジェクトが最もよく表現されていると思われるものに応じて、obj
のタイプをTofu
またはBox
(およびそれ以降)に変更する必要があります。次に、ユーザーは、対応するクラスに実装されている特定のアルゴリズムの恩恵を受ける必要があります。私はこの動作の良い実装を探しています。私は__class__
属性を変更する下記のコードを使用していますが、これは悪いスタイルだと確信しています。作成後のオブジェクトのタイプを変更する(Pythonでの型キャスト)
class CubicObject(object):
name = 'Baseclass'
def __init__(self, sidelength):
self.sidelength = sidelength
class Tofu(CubicObject):
name = 'Class A'
def eat(self):
print("I've eaten a volume of %s. " % (self.sidelength**3))
class Box(CubicObject):
name = 'Class B'
def paint(self):
print("I painted a surface of %s. " % (self.sidelength**2 * 6))
# user only knows the object is vaguely cubic
obj = CubicObject(sidelength=1.0)
# user thinks the object is a Box
obj.__class__ = Box
obj.paint()
# user changes mind and thinks its a piece of Tofu
obj.__class__ = Tofu
obj.eat()
obj.paint() # generates an error as it should, since we cannot paint Tofu
私の二つの質問があります:私はその__class__
属性を変更するとき
- どのようなクラス
A
のプロパティは、オブジェクトのobjの に転送されますか?どの機能が
と呼ばれ、どの属性が更新されているのか、それ以外にobj という名前がAのいずれかの名前に変更された場合はどうなりますか? - 私が望む振る舞いを実現するために、他にもクリーンな方法がありますか? が必要な場合は、オブジェクト
obj
を破棄してもう1つ、 を再作成できますが、この場合は一般的な方法(obj = RoundObject(subclasstype='Tofu')
のように コードのために)で行いたいと思います。
基本的な問題は、ユーザーがCubicObject
のサブクラスで独自の関数を実装できることと、プログラムの実行中にこれらのサブクラスを切り替えることができるということです。
これは大きなXY問題のようです。正確に何をしようとしているのですが、この機能が必要ですか? –
なぜこれが不可能であるかを示すダースの例を考え出すことができます。 –
これは、型キャストがあるJavaまたはC++で行うと思われることです。 – synchronizer