作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近我定义了一个 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/
我是一名优秀的程序员,十分优秀!