我是编程新手。我最近读过:
您的程序应该包含几乎所有功能 功能或类方法
这似乎我不应该同时拥有这两个函数和方法。我还读到方法应该简短。
好吧,我最近制作了一个从博客下载图片的小程序。我使用了类和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中使用函数。)
答案 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%地秉承它。