Python метод расширения родительского класса
Я пишу приложение Google Appengine на Python. Приложение получает и отправляет данные через сообщения конечных точек облака Google. Ниже вы найдете пример определения модели базы данных. Object содержит все объекты, ObjectBoolean только логические и ObjectInteger только целые. У всех классов есть два определенных метода: message_to_model() и model_to_message().
Как я могу повторно использовать методы в подклассах? Я хочу избавиться от повторяющегося кода, как:
self.name = request.name
self.description = request.description
self.created = request.created
self.modified = request.modified
Эти поля являются частью класса Object. Но в моем коде поля также перечислены в подклассах, чего я хочу избежать. Как мне этого добиться? Я уже проверил функцию 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
1 ответ
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
это новый класс стиля.