在类级属性中存储实例列表(自身)?

2024-09-30 05:17:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类,我想在其中存储同一类的对象的静态引用列表。例如:

class Apple:

    NICE_APPLES = [Apple('Elstar', 'Green'), Apple('Braeburn', 'Red'), 
        Apple('Pink Lady', 'Pink')]

    def __init__(self, name, colour):
        self.name = name
        self.colour = colour

这将导致NameError: name 'Apple' is not defined错误。 为什么这样不行?你知道吗

我已将代码更改为以下代码,这似乎在控制台上起作用:

class Apple:

    NICE_APPLES = []

    def __init__(self, name, colour):
        self.name = name
        self.colour = colour

Apple.NICE_APPLES = [Apple('Elstar', 'Green'), Apple('Braeburn', 'Red'), 
        Apple('Pink Lady', 'Pink')]

有没有更好的办法? 这在模块内部和外部都有效吗?这是否取决于我导入模块的方式?


Tags: nameselfappleinitdefgreenredclass
3条回答

在Apple类中将NICE_APPLES声明为空列表,然后在__init__()内部,完成对所有局部变量的赋值后,将self附加到列表中。你知道吗

class Apple(object):

    NICE_APPLES = []

    def __init__(self, name, color, keep=False):
        self.name = name
        self.color = color

        if keep:
            Apple.NICE_APPLES.append(self)

使用classmethod将apples附加到类列表中。你知道吗

class Apple:

    NICE_APPLES = []

    def __init__(self, name, colour):
        self.name = name
        self.colour = colour

    @classmethod
    def add_nice_apple(cls, name, colour):
        cls.NICE_APPLES.append(cls(name, colour))


Apple.add_nice_apple('Elstar','Green')
Apple.add_nice_apple('Braeburn','Red')

你可以从class方法创建新的class实例,就像这样,我认为这是一个干净的方法,如果你想存储最近创建的obj,除了一个硬连线列表:

class Apple:

    NICE_APPLES = []

    def __init__(self, name, colour):
        self.name = name
        self.colour = colour

    @classmethod
    def init_with_nice_apples(self, name, colour):
        Apple.NICE_APPLES = [Apple('Elstar', 'Green'), Apple('Braeburn', 'Red')] #hardcore list
        self.__init__(self,name, colour)
        Apple.NICE_APPLES.append(self)
        return self

ap = Apple.init_with_nice_apples("Delicius", "Red")

相关问题 更多 >

    热门问题