在面向对象编程中使用函数是不好的实践吗?

7 投票
3 回答
2164 浏览
提问于 2025-04-18 12:50

我刚开始学习编程。最近我读到:

你的程序应该把几乎所有的功能都封装在函数或者类的方法里。

这让我觉得我不应该同时使用函数和方法。我还读到方法应该简短且简单。

我最近做了一个小程序,可以从博客上下载图片。我用了类和面向对象编程(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 个回答

2

你的程序应该把几乎所有功能都封装在函数或者类的方法里。

注意“几乎”这个词。这就是你的灵活空间。

你提到的这个规则,其实是一个“经验法则”。它是个建议,尽量遵循,但只要合理就行。如果有时候需要例外,那也没关系,这并不是世界末日。这就是“几乎”这个词存在的原因。

而且如果没有“几乎”这个词,这种笼统的说法就不可能百分之百正确,总会有合理的例外。这个句子的意思是希望你走在正确的道路上,并不是说你必须完全死守这个规则。

5

别急着写类,简单的函数就能解决问题。这个观点来自于Python的哲学

  • 简单比复杂好。
  • 实用胜过完美。

在Python中,你可以用多种编程方式,比如过程式、面向对象和函数式编程。每种方式都有自己的优缺点,但都有它们的用处。

如果你在尝试用纯粹的面向对象的方法解决一个问题时遇到困难,这可能是个信号,说明你可能做错了,对象可能并不是解决这个特定问题的最佳方案。

你应该选择最适合这个问题的方法。

Jack Diederich在PyCon上的演讲“停止写类”中提供了一些很好的例子。一个很有启发性的教训是,如果你的对象有两个方法,其中一个是__init__,那么它实际上就是一个伪装的函数。

4

呃,不行。

在很多编程语言中,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__(),那么它可能需要成为一个类。

撰写回答