我是编程新手.我最近读过:
您的程序应该具有封装在函数或类方法中的几乎所有功能
这使得我似乎不应该同时拥有这两个函数和方法.我还读到方法应该简短.
好吧,我最近制作了一个从博客下载图像的小程序.我使用了类和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中使用函数.)
当函数满足时,不要去写类.从禅宗的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__(),它可能不需要是一个类。