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()?