Python - 类变量vs值的字典

时间:2014-08-06 19:38:22

标签: python

让我们说我有一个类,它代表一个具有许多属性的对象(简单的数据类型,如字符串和整数)。它们应该被表示为实例变量还是更好的" pythonic"将它们放入字典?

例如:

class FruitBasket:
    def __init__(self,apples, oranges, bananas, pears): #number of apples, oranges etc...
        self.apples = apples
        self.oranges = oranges
        self.bananas = bananas
        self.pears = pears



class FruitBasket:
    def __init__(self, fruits): #fruits is a dictionary
        self.fruits = fruits

4 个答案:

答案 0 :(得分:7)

我的一般理念是,如果项目集或多或少是固定的,则使用属性;如果集合可能在临时基础上更改,则使用字典。如果您的FruitBasket专门用于包含苹果,橘子,香蕉和梨,那么请使用属性。如果它可能包含任何随机分类的其他东西(例如,您有时可能会扔菠萝或覆盆子),请使用字典。

即使在您的示例代码中,也有一个原因。如果使用属性,则必须在代码中按字面指定每个属性(例如,self.pears)。此外,你经常最终做你在这里做的事情,你明确地将每个项目作为参数传递给__init__。如果你后来决定添加新水果,这显然不会起作用。您可以继续向__init__添加更多参数,但这很快就会变得难以处理。

此外,如果您有一组固定的项目,您可能会单独访问它们。也就是说,如果你知道你只有苹果,橘子,香蕉和梨,你可以像在这里一样直接访问它们(self.applesself.oranges等)。如果你事先不知道篮子里的水果是什么,你就不能知道使用先前的名字,所以你通常会通过迭代来处理它们。迭代字典的项目非常容易。相比之下,迭代对象的属性充满了危险,因为您无法轻易区分包含对象的数据的属性"关于" (例如,self.pears)来自与对象本身结构相关的那些(例如,self.__init__self.basketColorself.basketSize等。)

简而言之,如果你事先不知道篮子里会有什么内容,你会想要迭代它的内容,如果你想迭代某些内容,最好使用设计用于收容的类型(如列表或字典),因为这些类型可以将容器与其内容完全分开。

答案 1 :(得分:0)

这取决于你要做什么。字典更灵活,因为它更容易扩展新的成果,因为你可以迭代来获取它们。将成果表示为成员会使您无法进行某些输入,但您必须对所有访问进行硬编码。

存在中间立场,并且使用该模式同步两者。 Here有一些关于如何实施它的讨论。

而且,在你写另一节课之前,请记住:Stop writing classes.

答案 2 :(得分:0)

你可能想要使用字典,或者你可以使用新的python 3.4枚举!如果它应该是枚举。 https://docs.python.org/3/library/enum.html

from enum import Enum
animal = Enum('Animal', 'ant bee cat dog')
animal.ant

答案 3 :(得分:0)

之前已经多次提出过这个问题以及非常类似的问题,并且有各种AttrDict实现。

但是,你应该问自己是否有任何理由不使用词典。如果你不这样做,那么pythonic要做的就是显然使用dict。没有方法的类可能根本不应该是一个类。您还应该考虑并非所有有效的dict键都是有效的属性名称。