Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.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/google应用程序引擎中定义对象/实体的属性_Python_Google App Engine_Class Design - Fatal编程技术网

在python/google应用程序引擎中定义对象/实体的属性

在python/google应用程序引擎中定义对象/实体的属性,python,google-app-engine,class-design,Python,Google App Engine,Class Design,我见过这样的重复例子: from google.appengine.ext import db import datetime class Book(db.Expando): pass obj = Book() obj.title = 'The Grapes of Wrath' obj.author = 'John Steinbeck' obj.copyright_year = 1939 obj.author_birthdate = datetime.date(1902, 2, 27

我见过这样的重复例子:

from google.appengine.ext import db
import datetime

class Book(db.Expando):
    pass

obj = Book()
obj.title = 'The Grapes of Wrath'
obj.author = 'John Steinbeck'
obj.copyright_year = 1939
obj.author_birthdate = datetime.date(1902, 2, 27)

obj.put()
这是我第一次遇到这种类型的代码,其中属性设置在类定义之外。我觉得这是一种非常糟糕的做法。我更喜欢:

class Book(db.Model):
    title = db.StringProperty()
    author = db.StringProperty()
    copyright_year = db.IntegerProperty()
    author_birthdate = db.DateProperty()

...
    obj = Book(title='The Grapes of Wrath', author='John Steinbeck', copyright_year=1939, author_birthdate=datetime.date(1902, 2, 27))
有人能保证作者的实践的性质吗?何时何地可以接受这种方法


有人提到,谷歌的数据存储模式具有不同寻常的灵活性。我认为这个例子可能是对这个概念的拙劣和过于微妙的介绍。作者实际上已经指出了这种风格的缺点,但仍在继续重复。所以,它可能有一些优势。

这很有趣。我读了同一本书,也有同样的想法。自从appenginepython发布以来,我一直在使用它,从未使用Expando模型

我认为作者的意图是让那些可能不熟悉Python类的读者了解定义模型的概念,但我觉得这没有什么帮助

有一次,数据存储的灵活性对我来说很有用,那就是我将一个模型中的字段从使用DateTime切换到使用自定义字符串属性。具有这两种类型字段的实体可以并排存在,我可以在访问每种字段时对它们进行迁移。

这是有文档记录的。提供的代码段是有效的,尽管不清楚为什么类是完全空的,这可能是出于说明的目的。我想主要的问题是什么时候使用Expando模型

想象一下,一个网站可能收集各种商品的订单。一位顾客可能想要订购一只小猫,另一位顾客可能想要订购一本书,等等。一本书和一只小猫几乎没有共同点,可能只是价格和重量。但我们希望我们的客户提供他们的Irder的详细信息,例如,一位客户可能会订购一只3个月大、暹罗、蓝眼睛的小猫,另一位客户可能会订购《指环王》第二版、精装、作者签名等。虽然这些属性在收集订单时并不相关,但它们对您的业务逻辑至关重要。您也可以稍后处理这些属性


这里唯一的解决方案是使用Expando模型,因为您无法创建覆盖所有现有属性的通用类或类的层次结构。Expando模型将保存所有常规属性价格、重量、跟踪id、运输成本、自定义费用等,以及计算总计、折扣等的方法,其余属性将由客户在运行时动态创建。模型实例将与其所有属性一起保存到数据存储中,任何特定实例都将通过model.properties方法返回其上定义的所有属性

编程谷歌应用程序引擎,Dan Sanderson,O'Reilly/谷歌出版社。它非常分散,有谁知道学习谷歌应用程序引擎的更好的书吗?+1。一、 太,从来没有使用过和扩展。这是一个很酷的想法,我很高兴它在那里,但这并不是我用来教别人GAE数据存储编程的方法。能推荐一个更好的学习使用应用程序引擎Python的来源吗?@shafty这是我仅有的一本书。它有助于理解索引是如何工作的,以及查询的限制是什么。之后,我主要看了谷歌的示例应用程序,以及它们的参考文档,其中包含了大量的代码片段。根据您的Python经验,您可能希望学习Python第三版。它很好地涵盖了Python 2.5,并且可以便宜地购买和使用。这是一个非常清楚和简短的解释,如果作者愿意的话。很好的解释,尽管我认为这不是一个很好的理由:如果这些属性对于您的业务逻辑是必不可少的,那么它们应该包含在模型定义中的某个地方。这不是真的必要。这些属性对于满足客户的要求至关重要,比如客户得到的是红色的咖啡杯,而不是蓝色的,它们在处理逻辑上没有什么价值。你认为这是对Expando的滥用吗?如果我事先既不知道特定实例上的属性数量,也不知道它们的类型,那么有什么更好的方法呢?