在课程__init__
方法中遵循DRY规则的正确方法是什么?
我知道这两种方式:
class Foo:
def __init__(self, x, y, z=None):
self.x = x
self.y = y
self.z = z
class Bar:
_fields = ['x', 'y', 'z']
def __init__(self, x, y, z=None):
for field in self.__class__._fields:
setattr(self, field, locals()[field])
Foo中的方法非常重复,你必须输入三次每个属性名称,在类甚至少量属性和名称不那么冗长的类中这样做会非常累人。
另一方面,Bar中使用的方法更短,但是从IDE中得到了持续警告,说明存在“未解析的引用”。此方法也不允许在IDE中使用点运算符功能来自动完成属性。
我正在寻找如何创建不重复属性名称的类,并且仍然可以使用IDE中的某些功能。
我正在使用PyCharm作为我的IDE,但如果支持我正在尝试的内容,我会乐意改变其他任何内容。
答案 0 :(得分:2)
“另一方面,Bar中使用的方法更短”
不是真的...在你的例子中它是相同数量的行和更多的字符。当然,如果你将很多参数传递给构造函数,情况可能不是这样,但是......一旦你在构造函数中开始有太多的参数,那么你就需要一个重构来弄清楚如何剪切无论如何都要减少争论的数量......
使用第一个版本。你未来的自我/合作者会感谢你 1 。
1 实际上,你未来的合作者可能不会知道要感谢你...我想你的未来自我/合作者不会追捕你可能会更准确因为难以阅读代码而使你的生活变得悲惨: - )