gpt4 book ai didi

python - 使用枚举定义 python 类

转载 作者:行者123 更新时间:2023-11-28 16:32:01 28 4
gpt4 key购买 nike

最近我定义了一个 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 编码能力。

谢谢

最佳答案

你多次使用这个模式(这里显示的是 __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))

可以使用all 简化__eq__ 方法:

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

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

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

关于python - 使用枚举定义 python 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30909839/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com