1

私が持っているいくつかのPythonモデルクラスのカスタムモデル属性のリストに簡単にアクセスできるようにしています。ORMとしてMongoEngineを使用していますが、問題は一般的な継承とOOPです。

具体的には、すべてのモデルクラスで継承するMixinクラスのメソッドからカスタムモデル属性にアクセスできるようにしたいと考えています。

次のクラス構造を検討してください。

class ModelMixin(object):
    def get_copy(self):
        """
        I'd like this to return a model object with only the custom fields
        copied.  For the City object below, it would run code equivalent to:

          city_copy = City()
          city_copy.name = self.name
          city_copy.state = self.state
          city_copy.popluation = self.population
          return city_copy

        """


class City(BaseModel, ModelMixin):
    name = orm_library.StringField()
    state = orm_library.StringField()
    population = orm_library.IntField()

これにより、次のことが可能になります。

>>> new_york = City(name="New York", state="NY", population="13000000")
>>> new_york_copy = new_york.get_copy()

ただし、任意のモデルで機能する必要があります。どういうわけか、サブクラスで定義されているカスタム属性を判別し、そのサブクラスのインスタンスをインスタンス化し、親のBaseModelクラス(大量のランダムを含む)から組み込みの属性とメソッドをコピーせずに、それらのカスタムプロパティのみをコピーする必要があります。その中のstuf私は関係ありません

誰もが私がこれを行うことができる方法を知っていますか?

4

1 に答える 1

1

これを実現するために自由に使えるツールがいくつかあると思います (下にあるコードが目的の機能を果たさない場合は、かなり簡単に適応させることができるはずです)。すなわち:


class ModelMixin(object):
    def get_copy(self):

        # Get the class for the 

        C = self.__class__

        # make a new copy

        result = C()

        # iterate over all the class attributes of C
        # that are instances of BaseField

        for attr in [k for k,v in vars(C).items() if v.__class__ == BaseField]:
            setattr(result, attr, getattr(self, attr))

        return result

上記をテストするには (MongoEngine モデル/フィールドのダミー クラスを作成する)

class BaseField(object):
    pass

class BaseModel(object):
    baseField = BaseField()

class City(BaseModel, ModelMixin):
    x = BaseField()
    y = BaseField()

c = City()
c.x = 3
c.y = 4
c.baseField = 5

d = c.get_copy()
print d.x # prints '3'
print d.y # prints '4'
print d.baseField # correctly prints main.BaseField, because it's not set for d
于 2013-02-22T05:41:00.217 に答える