如何初始化类属性?

时间:2016-12-27 08:18:21

标签: python

我目前有以下两种方式:

class Venue:
    store = Database.store()
    ids = [vid for vid in store.find(Venue.id, Venue.type == "Y")]

    def __init__(self):
        self.a = 1
        self.b = 2

OR

class Venue:

    @classmethod
    def set_venue_ids(cls):
        store = Database.store()
        cls.ids = [vid for vid in store.find(Venue.id, Venue.type == "Y")]

    def __init__(self):
        self.a = 1
        self.b = 2

在使用/实例化类之前,我会调用:

Venue.set_venue_ids()

实现这一目标的正确方法是什么?

如果这是第一种方式,如果属性的实例化需要更复杂的逻辑,可以通过使用函数更简单地完成,我该怎么办?

或者是否有一种完全不同的方式来构建我的代码以完成我正在尝试做的事情?

1 个答案:

答案 0 :(得分:0)

从纯技术POV开始,类是其元类的一个实例,因此元类初始化器是类属性初始化的明显候选者(至少当你有一些复杂的东西时)。

现在给定一个类对象的规范生命周期(通常是整个过程),我肯定在这里使用一个属性 - 如果有人在你的进程运行时添加或删除数据库中的场地,您的ids属性将不同步。为什么不使用classmethod来确保您的数据始终是最新的?

哦,是的,构建你的Venue.ids(或任何其他需要非平凡代码的类属性)的另一种方法,而不需要在类顶层的复杂代码污染类命名空间(你注意到了吗?第一个示例store也成为类属性,如果使用Python 2.x,则vid是将代码放在普通函数中,并在类声明中调用该函数'身体,即:

def list_venue_ids():
    store = Database.store()
    # I assume `store.find()` returns some iterator (not a `list`)
    # if it does return a list, you could just
    # `return store.find(...)`.    
    return list(store.find(Venue.id, Venue.type == "Y"))

class Venue(object):
    ids = list_venue_ids()
    def __init__(self):
        self.a = 1
        self.b = 2