在以OOP方式工作时,不断测试类型值在Python中是否常见?
class Foo():
def __init__(self,barObject):
self.bar = setBarObject(barObject)
def setBarObject(barObject);
if (isInstance(barObject,Bar):
self.bar = barObject
else:
# throw exception, log, etc.
class Bar():
pass
或者,我可以使用更宽松的方法,例如:
class Foo():
def __init__(self,barObject):
self.bar = barObject
class Bar():
pass
最佳答案
不,实际上,就像在第二种方法中一样,绝大多数情况下不测试类型值。想法是代码的客户端(即使用您的类的其他程序员)应该能够传递具有所有适当方法或属性的任何类型的对象。如果不是碰巧是某个特定类的实例,那很好。您的代码永远不需要知道区别。这就是所谓的鸭子打字,因为这句格言“如果它像鸭子一样嘎嘎叫,像鸭子一样飞,那它很可能就是鸭子”(嗯,这不是真正的格言,但我想出了主旨)
您会在标准库中看到很多这样的地方,其中包含处理文件输入或输出的所有功能。他们将不需要任何实现file
或read()
方法(取决于函数)或readline()
进行编写的对象,而不是实际的write()
对象。实际上,您经常会在文档中看到此信息,例如使用 tokenize.generate_tokens
,我刚好在今天早些时候看过它:
这样,您就可以使用StringIO
对象(如内存文件)或像对话框这样的古怪东西来代替真实文件。
在您自己的代码中,只需访问所需对象的任何属性,如果它是错误类型的对象,则所需的属性之一将不存在,并且将引发异常。