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

BBe*_*dit 6 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?
Run Code Online (Sandbox Code Playgroud)

我还有其他类用于不同的网站API,还有一个Downloader类,它实际上将文件下载到磁盘和正确的目录.问题是,现在我所有的都是这些孤立的类和方法.

我想创建一个main也可以使用其他功能的函数,但是我再次认为这不是正确的OOP.

如何在不编写函数的情况下实际完成工作?(我读过的教科书说,如果我使用方法,不应该在纯OOP中使用函数.)

Rol*_*ith 5

当函数满足时,不要去写类.从禅宗的Python中解释 ;

  • 简单比复杂更好.
  • 实用性胜过纯洁.

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

如果您正在努力为问题构建纯粹的面向对象的解决方案,那么这可能表明您正在做错,并且对象不是解决该特定问题的最佳解决方案.

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

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


小智 4

嗯,不。

拥有一个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()
Run Code Online (Sandbox Code Playgroud)

除其他原因外,因为这允许您将代码作为模块重用并导入它,而不会导致每次都运行。

当然,愚蠢的一致性是一致的,但它首先是愚蠢的。做你需要做的事情,但要注意语言以确保你不只是重复工作。请参阅https://www.youtube.com/watch?v=o9pEzgHorH0观看有关何时编写类是一个糟糕主意的精彩视频 - 第一个经验法则通常是,如果一个对象有两个方法,并且其中一个方法是的__init__(),它可能不需要一个类。