2017-06-04 78 views
2

我有一个类,我想在其中存储同一类的对象的静态引用列表。例如:在类级别属性中存储实例(自我)的列表?

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 

这会导致错误。 为什么不能工作?

我已经改变了代码以下,这似乎在控制台上工作:

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')] 

有没有更好的方式来做到这一点? 这是否会在模块内部和外部工作,并且这取决于我导入模块的方式?

+2

在完成创建类之前,您无法创建类的实例!它在创建之前不会被绑定到名称上。 – jonrsharpe

+2

这听起来像[XY](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)问题。你为什么想这样做?你想达到什么目的? –

+2

这种方法的一个潜在问题 - 无论实例添加到列表中的哪个位置 - 将在实例被删除时维护列表,因为没有机制会自动删除它们。更好的方法是使用现有的容器类之一,如列表和字典,或者可以使用自定义的容器类。类别不应该关心自己的实例的存在(或不存在)。另一方面,也许你的实例应该是'Apple'的子类,在这种情况下,会有'class .__子类__()'来跟踪它们。 – martineau

回答

2

使用classmethod将苹果添加到班级列表中。

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') 
+0

当然,这种方式是最干净的:)之一,再加上一个 –

+0

确实!最后,我保存了一个元组列表,当需要时,我可以在运行时使用方法将其转换为对象。如果我最终将它们存储为类实例,毕竟我会使用这个答案,因为我发现它是最干净的。标记这一个被接受。 – Pepijn

1

申报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) 
+0

不会创建一个苹果的所有实例的列表?我只想要一组预定义(硬编码)值的列表。 – Pepijn

+0

啊。那么,你可以给'__init __()'添加一个默认为“False”的参数,然后只在该参数为“True”时执行append。看到我编辑的答案。 –

+0

@olisch erm,什么?该导入语句不会到达my_class_file中,并使Apple类忘记其真实姓名...... –

0

您可以从类方法来创建新的类实例,像这样的,我觉得这是一个干净的方式哟做,如果你还想要OBJ创建的最近存储除了hardcords的列表:

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") 
相关问题