一般编程问题。何时使用面向对象编程?
我的程序需要完成两件事。
从网页上提取一些内容。
对网页进行一些操作。
不过,网页有很多,比如Twitter和Facebook。
我该怎么做呢?
def facebookExtract():
code here
def twitterExtract():
code here
def myspaceExtract():
code here
def facebookProcess():
code here
def twitterProcess():
code here
def myspaceProcess():
code here
或者,我应该创建一个类吗?什么时候推荐使用类,什么时候又只用函数比较好呢?
6 个回答
把很多共同的内容放在一个函数里。尽量把可以提取出来的部分都提取出来,然后建立一个机制,根据每个网站来选择合适的函数。
一种可能的方法是使用Python的if/else
语句,但如果你有很多这样的函数,可能会想要更优雅的方式,比如:
F = __import__('yourproject.facebookmodule')
这样你就可以把专门针对Facebook的代码放在一个独立的地方。因为你传给__import__()
的是一个字符串,所以你可以根据你访问的网站在运行时修改这个字符串,然后在你的通用工作代码中调用函数F。
更多内容可以查看这里: http://effbot.org/zone/import-confusion.htm
“我的程序需要做两件事。”
当你这样开始的时候,程序中的对象是看不见的。你的思维方式不对。
换个角度想想。
“我的程序处理一些东西”
这就是面向对象的思维。你的程序处理的“东西”是什么?先定义这些东西。这些就是你的基本类。每种东西都有一个对应的类。
“我的程序从不同的来源获取这些东西”
每个来源都有一个类。
“我的程序展示这些东西”
这通常是通过访问这些东西的方法,再加上一些“报告”类来收集部分信息进行展示。
当你开始定义“东西”而不是“做”的时候,你就是在进行面向对象编程。面向对象的思维适用于所有程序,因为每个程序都涉及“做”和“东西”。你可以选择“做”的视角(这可以是过程式或函数式),也可以选择“东西”的视角(这就是面向对象的)。
我最喜欢的一个简单规则是:如果你不确定(前提是“你是个理智的人,而不是个狂热者”),那就创建并使用一些类。我发现自己经常把原本写成简单函数的代码重构成类——比如说,当这些简单函数之间最好的沟通方式是用全局变量时,这就是一个代码异味,强烈暗示系统的结构设计不太好——而且通常用面向对象的方法重构是一个合理的解决方案。
Python支持多种编程风格,但它的核心风格是面向对象编程(OOP),就像C++一样。当某个系统的某部分使用过程式或函数式的方法(可能通过生成器等)更合适时,这通常会很明显——例如,静态函数也是一种代码异味,如果你的类中有很多这样的函数,那就是一个提示,告诉你需要重构,避免这种情况。
所以,假设你对Python提供的所有编程风格都有一定了解——如果你仍然感到困惑,那就说明你可能想在系统的那部分使用面向对象编程!毕竟,Python对面向对象编程的支持比对函数式编程等的支持要更全面。
从你那段非常简单的代码来看,我觉得每对提取/处理的组合是紧密相关的,可能需要共享状态,所以创建一小组包含提取和处理方法的类似乎是个自然的选择。