0

詳細な質問は、A、B、C、D...Z など、たくさんのクラスがあり、それらはすべて「ベース」から派生したものです。それらはすべて set_value メソッドを持っています。ここで、A...Z の set_value をオーバーライドするサブクラスが必要です。新しい set_value の実装はすべて同じです。理論的には、クラス AA(A)、クラス BB(B) のようなことを行うことができます...しかし、それは退屈でコンパクトではありません。A...Z の 1 つまたはすべてにサブクラスが必要かどうかはわかりません。サブクラスのオブジェクトを作成するときに作成します。

C++ では、テンプレートを使用して簡単にこれを行うことができます。

template<class T>
class CCustom : public T
{
};
CCustom<vector<int> > obj1;
CCustom<list<char> > obj2;

私の質問を説明するのに役立ついくつかのデモ Python スクリプトをここに追加します。

class Base:
def set_value(self):
    pass

class A(Base):
    def set_value(self):
        print('A.set_value')

class B(Base):
    def set_value(self):
        print('B.set_value')

class C(Base):
    def set_value(self):
        print('C.set_value')


def more_set_value():
    print('all subclasses do this')

class AA(A):
    def set_value(self):
        more_set_value()
        super().set_value()

class BB(B):
    def set_value(self):
        more_set_value()
        super().set_value()

class CC(C):
    def set_value(self):
        more_set_value()
        super().set_value()

a = AA()
b = BB()
c = CC()

a.set_value()
b.set_value()
c.set_value()

AA、BB、CC がほぼ同じであることがわかります。この種のクラスをプロジェクトに何百も配置する必要がある場合、それは退屈です。AA、BB、および CC を動的に作成するために、ファクトリ関数を作成する方法が必要だと思います。これにより、次のことが可能になります。

  AA = create_custom_subclass(A)
  a = AA()
  a.set_value()
4

2 に答える 2

1

クラスはPythonの第一級市民です。つまり、他のオブジェクトと同じように扱うことができます。たとえば、単純なファクトリを実行できます。

def create_custom_subclass(cls):
    class sub(cls):
        def set_value(self):
            more_set_value()
            super().set_value()
    return sub

AA = create_custom_subclass(A)
a = AA()
a.set_value()

または、ミックスインを実行できます (ファクトリよりも少ないメモリを使用します)。

class Mixin:
    def set_value(self):
        more_set_value()
        super().set_value()

class AA(Mixin, A):
    pass
于 2013-08-30T07:28:32.163 に答える