在OOP中使用函数是不好的做法?

时间:2014-07-10 19:17:54

标签: python oop

我是编程新手。我最近读过:

  

您的程序应该包含几乎所有功能   功能或类方法

这似乎我不应该同时拥有这两个函数和方法。我还读到方法应该简短。

好吧,我最近制作了一个从博客下载图片的小程序。我使用了类和OOP方法,因为我需要继承某些东西。

但是,因为方法应该简短并做一件事,我的程序不能做太多。 我的问题是,如果我试图使用纯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,还有一个Downloader类,它实际上将文件下载到磁盘和正确的目录。问题是,现在我所拥有的只是这些孤立的类和方法。

我考虑创建一个main函数,它也可以使用其他函数,但我再次认为这不是正确的OOP。

如果不编写函数,我怎样才能真正完成工作? (我读过的教科书上说,如果我使用方法,不应该在纯OOP中使用函数。)

3 个答案:

答案 0 :(得分:5)

当功能足够时,不要去写课程。从Zen of Python;

转述
  • 简单比复杂更好。
  • 实用性胜过纯洁。

在Python中,您可以使用许多编程方法;程序性,面向对象,功能性。都有自己的优点和缺点。但都有它们的用途。

如果您正在努力为问题构建一个纯粹的面向对象的解决方案,这可能表明您做错了并且这些对象不是最佳解决方案特别的问题。

您应该采用最适合问题的方法。

Jack Diederich的PyCon演讲"停止写课程"包含一些很好的例子。一个有说服力的事后明显的教训是,如果你的对象有两个方法,其中一个方法是__init__,那它实际上是一个伪装的函数。

答案 1 :(得分:3)

嗯,没有。

拥有main()功能是如此普遍,并且在一些语言中需要使用它作为启动的钩子很好 - 某些地方必须说'去'。虽然,实现它是pythonic

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__(),那么可能需要成为一个班级。

答案 2 :(得分:2)

  

您的程序应该 几乎 封装在函数或类方法中的所有功能

注意"几乎"。那就是你的漏洞。

您引用的这条规则是"经验法则"。这是一个建议,尽可能地遵循,只要它是有道理的。如果你有时必须制作例外,那没关系,它不是世界末日。这就是为什么"几乎"字就在那里。

如果单词"几乎"在那里,像这样的一般性陈述永远不是100%真实,总有正当的例外。那句话想让你走上正确的道路,这并不意味着你必须100%地秉承它。