Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
父类的Python扩展方法_Python_Google App Engine_Super_Polymodel - Fatal编程技术网

父类的Python扩展方法

父类的Python扩展方法,python,google-app-engine,super,polymodel,Python,Google App Engine,Super,Polymodel,我正在用Python编写一个Google Appengine应用程序。该应用程序确实通过谷歌云端点消息接收和发送数据。下面是数据库模型定义的示例。对象包含所有对象,ObjectBoolean仅包含布尔对象,ObjectInteger仅包含整数对象。所有类都定义了两个方法:message_to_model()和model_to_message() 如何重新使用子类中的方法?我确实希望消除重复的代码,如: self.name = request.name self.d

我正在用Python编写一个Google Appengine应用程序。该应用程序确实通过谷歌云端点消息接收和发送数据。下面是数据库模型定义的示例。对象包含所有对象,ObjectBoolean仅包含布尔对象,ObjectInteger仅包含整数对象。所有类都定义了两个方法:message_to_model()和model_to_message()

如何重新使用子类中的方法?我确实希望消除重复的代码,如:

        self.name = request.name
        self.description = request.description
        self.created = request.created
        self.modified = request.modified
这些字段是对象类的一部分。但是在我的代码中,字段也列在子类中,这是我想要避免的。我怎样才能做到这一点?我已经检查了super()函数,但我认为这不适合我的情况,因为我不想执行我想扩展的方法

干杯

-卢卡

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
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
是一个新样式类。

您好,非常感谢。polymodel是一个新的样式类。我确实添加了您描述的代码,它确实起了作用。模型到消息()如何?是否也可能有“返回”?或者我必须重写它来存储消息的一部分吗?如果可以通过构造函数以另一种方式将ObjectBooleanMessage传递给ObjectReposeMessage,则可以再次使用super调用Object.model_to_消息,将ObjectBooleanMessage添加到结果中,然后返回它。或者,您可以为Object.model_to_消息提供第二个kwargs参数,并将这些参数传递给ObjectBooleanMessage。然后,ObjectBoolean.message_to_模型可以使用关键字参数调用Object.model_to_消息:boolean=ObjectBooleanMessage(…)