猿问

为什么定义中间实例以在Python中调用方法?

尽管有一些读物,但我不理解面向对象编程仍然有黑暗。这是我第二次看到有必要创建一个类的中间实例来调用方法。从urllib文档中检查以下示例:


import urllib

opener = urllib.FancyURLopener({})

f = opener.open("http://www.python.org/")

f.read()

我不明白为什么它需要创建opener实例来调用该open方法。我不明白为什么以下代码不起作用:


import urllib

f = urllib.FancyURLopener.open("http://www.python.org/")

f.read()

尝试致电时出现错误urllib.FancyURLopener.open:


TypeError: unbound method open() must be called with FancyURLopener instance as first argument (got str instance instead)

你们能把灯光带进这个阴影吗?非常感谢 !


倚天杖
浏览 142回答 2
2回答

慕田峪7331174

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)。
随时随地看视频慕课网APP

相关分类

Python
我要回答