使用枚举定义python类

时间:2015-06-18 08:10:46

标签: python class enums

最近我定义了一个Python类,如下所示。

from datetime import datetime, date, time
import enums


class ExampleClass:

    defaults = (-1, "", "", datetime.today(), "", -1, [], "", -1, "", "", [], "")

    def __init__(self, **kwargs):
        count = 0
        for ex in enums.ExampleEnums:
            setattr(self, ex.name, kwargs.get(ex.value, ExampleClass.defaults[count]))
            count += 1

    def __str__(self):
        return_string = "Example Object with "
        count = 0
        for val in enums.ExampleEnums:
            if (getattr(self, val.name) != ExampleClass.defaults[count]):
                return_string += str("%s: %s, " % (val.name, getattr(self, val.name)))
            count += 1
        return return_string[:-2]

    def __repr__(self):
        return_string = ""
        count = 0
        for val in enums.ExampleEnums:
            if (getattr(self, val.name) != ExampleClass.defaults[count]):
                return_string += str("%s=%s, " % (val.value, getattr(self, val.name)))
            count += 1
        return return_string[:-2]

    def __eq__(self, other):
        for val in enums.ExampleEnums:
            if (getattr(self, val.name) != getattr(other, val.name)):
                return False
        return True

    def __ne__(self, other):
        for val in enums.ExampleEnums:
            if (getattr(self, val.name) == getattr(other, val.name)):
                return False
        return True

无论如何,我想知道:这是为数据类编写类定义的好方法吗?有什么方法可以改善这个吗?我不需要任何代码,只是通用性很好,因为我只是将其作为一种方式来了解如何在Python中提高自己的编码能力。

由于

3 个答案:

答案 0 :(得分:2)

您多次使用此模式(此处显示的是__init__,它也适用于__str____repr__):

count = 0
for ex in enums.ExampleEnums:
    setattr(self, ex.name, kwargs.get(ex.value, ExampleClass.defaults[count]))
    count += 1

最好直接迭代ExampleClass.defaults中的项目,而不是手动计算索引。这可以使用zip

来实现
for ex, default in zip(enums.ExampleEnums, ExampleClass.defaults):
    setattr(self, ex.name, kwargs.get(ex.value, default))

__eq__方法可以使用all简化:

def __eq__(self, other):
    return all(getattr(self, val.name) == getattr(other, val.name)
               for val in enums.ExampleEnums)

然后,正如其他人已经说过的那样,您可以用__ne__或甚至使用__eq__运算符来表达==

def __ne__(self, other):
    return not self == other

答案 1 :(得分:1)

您可以在功能self._eq__(other)中致电__ne__

答案 2 :(得分:0)

编写数据类的最佳方法因用例而异。但是根据你所呈现的内容,你不应该重复代码。一旦定义了__eq__运算符,就应该在其他地方使用它。 (如果你对__eq__的定义发生了变化怎么办?)另外,你不必在阳光下定义每一种魔法......只是对你有价值的东西。

查看Python魔术方法指南:http://www.rafekettler.com/magicmethods.html

另请参阅__ne__ vs __eq__上的此答案以及如何定义它们:Python implementing ne operator based on eq

您还应该查看装饰器(以及@property,具体而言)。