2014-03-26 52 views
0

我正在Python中編寫Google Appengine應用程序。該應用程序確實通過谷歌雲端點消息接收和發送數據。下面你會找到一個數據庫模型定義的例子。 Object包含所有對象,ObjectBoolean只是布爾值,ObjectInteger只是整數。所有的類都定義了兩個方法:message_to_model()和model_to_message()。父類的Python擴展方法

如何重新使用子類中的方法?我想擺脫重複代碼,如:

 self.name = request.name 
     self.description = request.description 
     self.created = request.created 
     self.modified = request.modified 

這些字段是對象類的一部分。但在我的代碼中,這些字段也列在子類中,這是我想要避免的。我怎樣才能做到這一點?我已經檢查過super()函數,但我認爲這不適合我的情況,因爲我不想執行我想要擴展它的方法。

乾杯

-Luca。

from google.appengine.ext.ndb import polymodel 
from google.appengine.ext import ndb 
from endpoint_messages.object import * 


class Object(polymodel.PolyModel): 
    name = ndb.StringProperty(required=True, verbose_name="Name") 
    description = ndb.TextProperty(verbose_name="Description") 
    created = ndb.DateTimeProperty(auto_now_add=True, verbose_name="Created") 
    modified = ndb.DateTimeProperty(auto_now=True, verbose_name="Modified") 

    def model_to_message(self): 
     return ObjectResponseMessage(class_name=self._class_name(), 
            id=self.key.integer_id(), 
            name=self.name, 
            description=self.description, 
            created=self.created, 
            modified=self.modified) 

    def message_to_model(self, request): 
     self.name = request.name 
     self.description = request.description 
     self.created = request.created 
     self.modified = request.modified 


class ObjectBoolean(Object): 
    current = ndb.BooleanProperty(verbose_name="Current") 
    target = ndb.BooleanProperty(verbose_name="Target") 

    def model_to_message(self): 
     return ObjectResponseMessage(class_name=self._class_name(), 
            id=self.key.integer_id(), 
            name=self.name, 
            description=self.description, 
            created=self.created, 
            modified=self.modified, 
            boolean=ObjectBooleanMessage(current=self.current, 
                    target=self.target)) 

    def message_to_model(self, request): 
     self.name = request.name 
     self.description = request.description 
     self.created = request.created 
     self.modified = request.modified 
     if request.boolean: 
      self.current = request.boolean.success 
      self.target = request.boolean.target 


class ObjectInteger(Object): 
    current = ndb.IntegerProperty(verbose_name="Current") 
    target = ndb.IntegerProperty(verbose_name="Target") 

    def model_to_message(self): 
     return ObjectResponseMessage(class_name=self._class_name(), 
            id=self.key.integer_id(), 
            name=self.name, 
            description=self.description, 
            created=self.created, 
            modified=self.modified, 
            float=ObjectIntegerMessage(current=self.current, 
                   target=self.target)) 

    def message_to_model(self, request): 
     self.name = request.name 
     self.description = request.description 
     self.created = request.created 
     self.modified = request.modified 
     if request.integer: 
      self.current = request.integer.current 
      self.target = request.integer.target 

回答

2

super()可以用於此目的。你可以使用這樣的事情在ObjectBoolean

def message_to_model(self, request): 
    super(ObjectBoolean, self).message_to_model(request) 

    if request.boolean: 
     self.current = request.boolean.success 
     self.target = request.boolean.target 

對於這項工作,Object必須是一種新的風格類,它是,如果polymodel.PolyModel是一種新的風格類。

+0

您好,請多多指教。它看起來像polymodel.PolyModel是一個新的風格類。我確實按照你所描述的方式添加了代碼,它確實有效。那麼model_to_message()呢? 「返回」還有可能嗎?或者我會不得不重寫它來存儲消息的一部分? – decurgia

+0

如果可以通過構造函數的另一種方式將ObjectBooleanMessage傳遞給ObjectReposeMessage,那麼可以再次使用super來調用Object.model_to_message,將ObjectBooleanMessage添加到結果中,然後將其返回。或者,您可以爲Object.model_to_message指定第二個kwargs參數,並將這些參數傳遞給ObjectBooleanMessage。 ObjectBoolean.message_to_model可以用關鍵字參數調用Object.model_to_message:boolean = ObjectBooleanMessage(...) – spkersten