在程序中只有一个类时,使用类的理由是什么?
我看到有些人用Python写代码时,会先创建一个类,然后再用这个类来创建一个对象,以调用所有的方法。如果我们不使用继承、封装这些特性,使用类有什么好处呢?我觉得这样的代码不太干净,因为有很多'self'参数,这些本来可以避免。这样的写法是受到其他编程语言,比如Java的影响吗?还是说有其他好的理由让Python的程序要这样结构化呢?
示例代码:
class App:
# all the methods go here
a = App()
5 个回答
1. 我知道这个的一个用处。
虽然可以通过其他方式实现这个功能,但这样做可以确保模块 module_B 和 module_C 使用的是同一个 App 实例,而不是各自创建不同的对象。
在 module_A.py 中
class App:
....
a = App()
在 module_B.py 中
from module_A import a
在 module_C.py 中
from module_A import a
当然,你可以创建不同的对象,但这并不是上面模块的初衷。
如果你在 module_D.py 中这样做会怎样呢
from module_A import App
a = App()
2. [较为啰嗦]
你可以不使用类,只用模块和函数来拆解你的解决方案。但在一个大型程序中,这样看起来会很糟糕吧。你不想在你的程序中使用面向对象的编程方式吗?所有语言都有某种方式来利用面向对象的特性。我们都喜欢一些东西,而有些东西则让我们反感。明确的东西通常比隐含的更好,这通常是 Python 的风格。虽然这并不是它被包含的充分理由。
我自己也经常这样做,尤其是在应用程序的管理部分。理论上,这些部分可以简化为简单的、非常顺序的功能编程。
对我来说,最大的好处是它能很好地封装你的主循环或者一次性执行的部分,这样可以高效、干净地配置运行过程,并在不同的代码块之间持久化数据。基本上,你可以根据需要重新配置这些内容,而不必修改代码本身。更不用说,你还可以将一个执行过程子类化,变成一个不同且扩展的版本。
这样扩展主程序通常比处理一大块200行的代码要简单得多,因为后者的代码往往比较难以理解。
当你写够多的Python后,self这个概念就不再是障碍了。个人来说,我喜欢它能立刻给我一个视觉上的区分,让我清楚哪些是我希望在不同作用域之间保持的内容,哪些是我希望在特定步骤完成后就被丢弃的临时元素。
最后,有些人会把任何东西都用面向对象的方式处理,或者根本看不懂这些。我就是其中之一 :)
一个好处,虽然并不总是适用,就是通过子类化一个类,可以很容易地扩展程序。举个例子,我可以创建一个子类,重写一个方法,把它从读取csv文件改成读取xml文件,然后根据运行时的信息来实例化子类或者原始类。这样,程序的逻辑就可以正常进行。
当然,这就引出了一个问题:读取文件到底是这个类的责任,还是应该由一个专门的类来处理不同类型数据的读取,并提供统一的接口?不过,这个问题就另当别论了。
就我个人而言,我觉得最清晰的做法是把那些对参数有强假设的函数放在合适的类里作为方法,而把那些对参数假设很弱的函数放在模块里作为普通函数。