在以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

最佳答案

不,实际上,就像在第二种方法中一样,绝大多数情况下不测试类型值。想法是代码的客户端(即使用您的类的其他程序员)应该能够传递具有所有适当方法或属性的任何类型的对象。如果不是碰巧是某个特定类的实例,那很好。您的代码永远不需要知道区别。这就是所谓的鸭子打字,因为这句格言“如果它像鸭子一样嘎嘎叫,像鸭子一样飞,那它很可能就是鸭子”(嗯,这不是真正的格言,但我想出了主旨)

您会在标准库中看到很多这样的地方,其中包含处理文件输入或输出的所有功能。他们将不需要任何实现fileread()方法(取决于函数)或readline()进行编写的对象,而不是实际的write()对象。实际上,您经常会在文档中看到此信息,例如使用 tokenize.generate_tokens ,我刚好在今天早些时候看过它:



这样,您就可以使用StringIO对象(如内存文件)或像对话框这样的古怪东西来代替真实文件。

在您自己的代码中,只需访问所需对象的任何属性,如果它是错误类型的对象,则所需的属性之一将不存在,并且将引发异常。

10-07 13:20
查看更多