Python 如何从属性定义访问类方法
我有一个模型,我想使用一个类方法来设置属性的默认值:Python 如何从属性定义访问类方法,python,google-app-engine,Python,Google App Engine,我有一个模型,我想使用一个类方法来设置属性的默认值: class Organisation(db.Model): name=db.StringProperty() code=db.StringProperty(default=generate_code()) @classmethod def generate_code(cls): import random codeChars='ABCDEF0123456789'
class Organisation(db.Model):
name=db.StringProperty()
code=db.StringProperty(default=generate_code())
@classmethod
def generate_code(cls):
import random
codeChars='ABCDEF0123456789'
while True: # Make sure code is unique
code=random.choice(codeChars)+random.choice(codeChars)+\
random.choice(codeChars)+random.choice(codeChars)
if not cls.all().filter('code = ',code).get(keys_only=True):
return code
但我有一个名字错误:
NameError: name 'generate_code' is not defined
如何访问generate_code()?您需要指定类名:
组织。generate_code()您需要指定类名:组织。generate_code()
正如我在评论中所说的,我将使用classmethod作为工厂,并始终在那里创建实体。它使事情变得更简单,没有让人讨厌的钩子来获得你想要的行为
下面是一个简单的例子
class Organisation(db.Model):
name=db.StringProperty()
code=db.StringProperty()
@classmethod
def generate_code(cls):
import random
codeChars='ABCDEF0123456789'
while True: # Make sure code is unique
code=random.choice(codeChars)+random.choice(codeChars)+\
random.choice(codeChars)+random.choice(codeChars)
if not cls.all().filter('code = ',code).get(keys_only=True):
return code
@classmethod
def make_organisation(cls,*args,**kwargs):
new_org = cls(*args,**kwargs)
new_org.code = cls.generate_code()
return new_org
正如我在评论中所说的,我将使用classmethod作为工厂,并始终通过它创建实体。它使事情变得更简单,没有让人讨厌的钩子来获得你想要的行为
下面是一个简单的例子
class Organisation(db.Model):
name=db.StringProperty()
code=db.StringProperty()
@classmethod
def generate_code(cls):
import random
codeChars='ABCDEF0123456789'
while True: # Make sure code is unique
code=random.choice(codeChars)+random.choice(codeChars)+\
random.choice(codeChars)+random.choice(codeChars)
if not cls.all().filter('code = ',code).get(keys_only=True):
return code
@classmethod
def make_organisation(cls,*args,**kwargs):
new_org = cls(*args,**kwargs)
new_org.code = cls.generate_code()
return new_org
在模块级别上移动generate_code()实现。不需要解释为什么这必须是一个类方法。谢谢-我试过了,但是generate_code()找不到Organization()来查询现有代码。它与Organization对象关系密切,如果可以的话,将其包含在类中似乎是明智的。此外:为每次调用编写一个返回随机数据的方法是可以的,但只调用一次以生成一个一次性永久默认值似乎是无意义的。您试图解决的实际问题是什么?这段代码看起来很奇怪(说得很好听),正如前面的一句话,您将只在类的解析时生成默认值,而不是在实体创建时生成默认值,请重新考虑您在这里所做的操作。将generate_code()实现移到模块级别。不需要解释为什么这必须是一个类方法。谢谢-我试过了,但是generate_code()找不到Organization()来查询现有代码。它与Organization对象关系密切,如果可以的话,将其包含在类中似乎是明智的。此外:为每次调用编写一个返回随机数据的方法是可以的,但只调用一次以生成一个一次性永久默认值似乎是无意义的。您试图解决的实际问题是什么?这段代码看起来很奇怪(说得很好听),正如前面的一句话,您只会在类的解析时得到默认值,而不会在实体创建时得到,重新思考你在这里做什么。然后我得到了名称错误:名称“Organization”未定义。也许你可以使用新名称错误:名称“Organization”未定义。也许你可以使用新名称。我们不希望对Appengine模型重载,这是否也适用于新名称?我们不希望为Appengine模型重载uu init uuuu(),这是否也适用于u new uuu()?