如何从属性定义访问类方法

时间:2012-08-14 04:31:22

标签: 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'
        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:

NameError: name 'generate_code' is not defined

如何访问generate_code()?

3 个答案:

答案 0 :(得分:4)

正如我在评论中所说,我会使用一种类方法作为工厂,并始终通过那里创建实体。它使事情更简单,没有讨厌的钩子来获得你想要的行为。

这是一个简单的例子。

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

答案 1 :(得分:0)

import random

class Test(object):

    def __new__(cls):
        cls.my_attr = cls.get_code()
        return super(Test, cls).__new__(cls)

    @classmethod
    def get_code(cls):
        return random.randrange(10)

t = Test()
print t.my_attr

答案 2 :(得分:-1)

您需要指定班级名称:Organisation.generate_code()