在面向对象编程中使用函数是不好的实践吗?
我刚开始学习编程。最近我读到:
你的程序应该把几乎所有的功能都封装在函数或者类的方法里。
这让我觉得我不应该同时使用函数和方法。我还读到方法应该简短且简单。
我最近做了一个小程序,可以从博客上下载图片。我用了类和面向对象编程(OOP)的方法,因为我需要继承某些东西。
但是,由于方法应该简短并且只做一件事,我的程序功能就很有限。我的问题是,如果我想用纯粹的面向对象的方法,怎么才能避免写函数呢?
我的脚本基本上是这样的:
class Tumblr(object):
def __init__(self, user):
self.user = user
def get_posts(self):
"""Use tumblr api to return a user's posts."""
return client['blog']['posts']
def parse_images(self):
"""Returns images."""
images = []
for post in posts:
if 'image' in post:
images.append(post['image'])
return images
def parse_videos(self):
"""Returns videos."""
def main():
# this is a function, and thus not OOP?
我还有其他类来处理不同网站的API,还有一个下载器类,实际上是把文件下载到磁盘和正确的目录。问题是,现在我只有这些孤立的类和方法。
我考虑过创建一个 main
函数,这样可以使用其他函数,但我觉得这不符合OOP的原则。
我怎么才能在不写函数的情况下完成工作呢?(我读的教科书说,如果我在使用方法,就不应该使用函数。)
3 个回答
你的程序应该把几乎所有功能都封装在函数或者类的方法里。
注意“几乎”这个词。这就是你的灵活空间。
你提到的这个规则,其实是一个“经验法则”。它是个建议,尽量遵循,但只要合理就行。如果有时候需要例外,那也没关系,这并不是世界末日。这就是“几乎”这个词存在的原因。
而且如果没有“几乎”这个词,这种笼统的说法就不可能百分之百正确,总会有合理的例外。这个句子的意思是希望你走在正确的道路上,并不是说你必须完全死守这个规则。
别急着写类,简单的函数就能解决问题。这个观点来自于Python的哲学。
- 简单比复杂好。
- 实用胜过完美。
在Python中,你可以用多种编程方式,比如过程式、面向对象和函数式编程。每种方式都有自己的优缺点,但都有它们的用处。
如果你在尝试用纯粹的面向对象的方法解决一个问题时遇到困难,这可能是个信号,说明你可能做错了,对象可能并不是解决这个特定问题的最佳方案。
你应该选择最适合这个问题的方法。
Jack Diederich在PyCon上的演讲“停止写类”中提供了一些很好的例子。一个很有启发性的教训是,如果你的对象有两个方法,其中一个是__init__
,那么它实际上就是一个伪装的函数。
呃,不行。
在很多编程语言中,main()
函数是非常常见的,甚至是必须的,所以用它来启动程序是没问题的——总得有个地方说“开始”。不过,在Python中,写成下面这样更符合它的风格:
class YourObjectHere(object):
###blahblahblah your code here
...
...
def main():
MyObj = YourObjectHere(*args, **kwargs)
OtherObj.do_stuff_with_obj(MyObj)
#etc etc etc
...
...
if __name__ == '__main__':
main()
其中一个原因是,这样可以让你把代码当作模块重用,并且在导入时不会每次都运行这个代码。
固执地保持一致性当然可以,但首先这是一种愚蠢的做法。你可以按照自己的需要去做,但要注意语言的特性,确保你不是在重复做同样的事情。可以看看这个视频:https://www.youtube.com/watch?v=o9pEzgHorH0,里面讲了什么时候写类是不明智的——通常的经验法则是,如果一个对象有两个方法,其中一个是__init__()
,那么它可能不需要成为一个类。