【发布时间】:2012-07-10 11:35:06
【问题描述】:
假设我们有以下代码:
class A:
var = 0
a = A()
我确实明白a.var 和A.var 是不同的变量,我想我明白为什么会发生这种情况。我认为这只是 python 数据模型的副作用,因为为什么有人要修改实例中的类变量?
然而,今天我遇到了这样一个奇怪的例子:它在谷歌应用引擎db.Model reference中。 Google 应用引擎数据存储假设我们继承 db.Model 类并将键作为类变量引入:
class Story(db.Model):
title = db.StringProperty()
body = db.TextProperty()
created = db.DateTimeProperty(auto_now_add=True)
s = Story(title="The Three Little Pigs")
我不明白他们为什么希望我这样做?为什么不引入构造函数,只使用实例变量呢?
【问题讨论】:
-
只要它在内部引用
self.var而不是CLASSNAME.var,那么它只是修改自己实例的值,有效地成为实例变量...... -
@JoranBeasley 是的,它们的行为确实像实例变量,那么为什么不让它们成为实例呢? :) 类变量看起来太多了。
-
注意 appengine 使用元类。您的类中的属性定义正在创建 Property 对象的实例,这些实例管理从数据存储中获取的数据到实例化对象的映射。这与其他基于 ORM 的库(如 SQLAlchemy、Storm 等)使用的方法相同。如果您想了解更多有关元类和元编程的信息,请顺其自然。
标签: python google-app-engine python-2.7 class-variables