以正确的方式编写大型python类

以正确的方式编写大型python类,python,class,coding-style,Python,Class,Coding Style,编写一个python类时,该类具有获取数据和解析数据的不同函数;最正确的方法是什么? 您可以编写它,以便填充self.data。。。然后运行解析函数来填充self.parsed_数据。。。。或者,编写接受self.data并返回self.parsed_数据的函数是否正确 下面的例子。 MyClass1填充self.variables,MyClass2将它们作为参数。 我认为我的第二类是“最”正确的 那么,什么是正确的呢?为什么?一段时间以来,我一直在尝试决定这两种编码风格中的哪一种。但我想知道哪

编写一个python类时,该类具有获取数据和解析数据的不同函数;最正确的方法是什么? 您可以编写它,以便填充self.data。。。然后运行解析函数来填充self.parsed_数据。。。。或者,编写接受self.data并返回self.parsed_数据的函数是否正确

下面的例子。 MyClass1填充self.variables,MyClass2将它们作为参数。 我认为我的第二类是“最”正确的

那么,什么是正确的呢?为什么?一段时间以来,我一直在尝试决定这两种编码风格中的哪一种。但我想知道哪一个被认为是最佳实践

类MyClass1(对象):
定义初始化(自):
self.raw_数据=无
定义解析数据(自):
#这是一个相当复杂的函数xml/json解析器
原始数据=self.raw\u数据
data=raw#u data#我们做了很多事情来处理raw#u数据
cache.set('cache_key',data,600)#缓存10分钟
返回数据
定义填充数据(自):
#此函数用于从外部源获取数据
self.raw_data='一些原始数据、xml、json或类似数据..'
def获取解析数据(自身):
cached\u data=cache.get('cache\u key'))
如果缓存了数据:
返回缓存的数据
其他:
self.\u填充\u数据()
返回self._parse_data()
mc1=MyClass1()
打印mc1.get_parsed_data()
类MyClass2(对象):
定义解析数据(自身、原始数据):
#这是一个相当复杂的函数xml/json解析器
数据=原始数据#经过一些复杂的原始数据解析工作后
cache.set('cache_key',data,600)#缓存10分钟
返回数据
def_获取_数据(自身):
#此函数用于从外部源获取数据
返回“一些原始数据、xml、json或类似内容…”
def获取解析数据(自身):
cached\u data=cache.get('cache\u key'))
如果缓存了数据:
返回缓存的数据
其他:
返回self.\u填充数据(self.\u获取数据())
mc2=MyClass2()
打印mc1.get_parsed_data()

第二种方法更可取,因为(如果我理解正确的话)它在效率和结果上是相同的,但避免了为原始数据使用实例成员。通常,您希望减少对象中存储的数据量,因为每个额外属性都意味着随着时间的推移更加担心一致性


换句话说,它“更具功能性”。

这样思考这个问题:如果不使用两个方法,而是将这个逻辑组合成一个长方法,那么在解析原始数据之后,您会跟踪它吗?如果答案是肯定的,那么将其存储为属性是有意义的。但是如果在那之后你不再关心它,那就选择第二种形式。将部分逻辑分解为“helper”子例程最好避免对类进行其他方法可能需要关心的更改。

最后,这取决于个人偏好。但是在我看来,最好只使用一个名为
parse_data
的模块级函数,它接收原始数据,执行大量工作并返回解析后的数据。我假设您的缓存键是从原始数据中派生出来的,这意味着
parse\u data
函数也可以实现您的缓存逻辑

与拥有一个成熟的类相比,我更喜欢函数的原因是简单。如果你想让一个类从你的原始数据中提取数据字段,这样你的对象的用户就可以做一些类似于obj的事情。一些属性,而不必查看一些较低级别的数据结构(例如JSON、XML、Python dict等),我会创建一个简单的“值对象”类,它只包含数据字段,没有解析逻辑,让前面提到的
parse_data
函数返回这个类的一个实例(基本上作为数据类的工厂函数)。这将导致更少的状态、更简单的对象和无惰性,从而使代码更易于推理


这也使得对此类的使用者进行单元测试变得更容易,因为在这些测试中,您可以简单地用字段实例化数据对象,而不必提供大量的测试原始数据。

对我来说,最正确的类是用户理解并使用的类,错误越少越好

当我看第二课的时候,我问自己我将如何使用它

mc2 = MyClass2()
print mc1.get_parsed_data()
我只想

print get_parsed_data()

有时候,最好是一点也不做。

这个例子不应该是一个类。但是它是另一个类的一个非常简单的版本,应该是一个类:)但是感谢链接,类不应该仅仅因为我们可以使用就被使用。。