2 回答
TA贡献1828条经验 获得超13个赞
urllib有许多不同类型的开启器。好吧,好吧,它有一对夫妇,不是很多,但关键是旁边的。如果您urllib.open
以自己想要的方式调用,那么urllib应该如何知道您打算使用哪个打开器?
之所以知道这一点,是因为您的“中间步骤”创建了特定类型的开启器的实例。如果您创建的实例FancyURLOpener
,则python将知道那是您想要的特定类型的打开器。如果要使用它URLOpener
,请创建that的实例,然后可以使用它。
不要认为这是一个中间步骤,把它当做了一步-的方式来告诉Python“这是URL的特定类型的揭幕战我想用”。
现在,当然,可以用非OO方式编写python,并让您告诉open方法要使用哪种类型的打开器。例如,非OO方法可能会让您执行以下操作:f = urllib.open({}, type="Fancy")
。那行得通,对吧?许多人都以这种风格编写代码并且可以工作,那么为什么还要麻烦对象呢?
使用面向对象的方法意味着您可以使用自己的特殊属性创建自己的打开器。例如,高级版本的文档说它“为以下HTTP响应代码提供默认处理:301、302、303、307和401”。如果您还希望默认处理404怎么办?您可以将其称为CJOpener,但是要使用它,您必须修改urllib
自身以将“ CJ”和“ Fancy”用作最后一个参数。您是否真的要修改内置的python代码?
类和对象是解决方案。该类定义接口-打开器应该使用的标准方式。您可以自由创建自己的变体,而您要做的就是创建一个子类,然后创建该子类的实例。完成此操作后,世界上任何一个知道如何使用FancyURLOpener
并URLOpener
立即知道如何与打开器一起使用的python代码。
因此,此中间步骤的优点是一种方便的方法,可以告诉python您要使用的通用API的哪个版本。所有知道如何使用此API的程序也将知道如何使用您的API版本(假设您没有破坏标准API)。
添加回答
举报