最近我定义了一个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中提高自己的编码能力。
由于
答案 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
,具体而言)。