在Python中测试类型值是常见/好的做法吗?

Geo*_*lva 10 python oop introspection

在以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
Run Code Online (Sandbox Code Playgroud)

或者我可以使用更松散的方法,例如:

class Foo():
    def __init__(self,barObject):
        self.bar = barObject

class Bar():
    pass
Run Code Online (Sandbox Code Playgroud)

Dav*_*d Z 19

不,实际上它的压倒性普遍来测试类型的值,如你的第二个方法.我们的想法是,您的代码的客户端(即使用您的类的其他程序员)应该能够传递具有所有适当方法或属性的任何类型的对象.如果它不是某个特定类的实例,那就没问题; 你的代码永远不需要知道差异.这被称为鸭子打字,因为谚语"如果它像鸭子一样嘎嘎叫,像鸭子一样苍蝇,它也可能是一只鸭子"(嗯,这不是真正的谚语,但我认为这是我的主旨)

您将在标准库中看到很多这样的地方,其中包含处理文件输入或输出的任何函数.他们不需要实际的file对象,而是采取任何实现read()readline()方法(取决于函数)或write()写入的东西.事实上,你经常会在文档中看到这一点,比如tokenize.generate_tokens我今天刚刚看到的那个:

所述generate_tokens() 发电机需要一个参数,readline的,它必须是一个可调用的对象,它提供了相同的接口readline() 的方法内置的文件对象(见文件对象).每次调用函数都应该返回一行输入作为字符串.

这允许您使用StringIO对象(如内存文件)或类似对话框的东西来代替真实文件.

在您自己的代码中,只需访问您需要的对象的任何属性,如果它是错误的对象类型,您需要的其中一个属性将不存在,它将抛出异常.

  • 第二个.另见[EAFP](http://docs.python.org/glossary.html#term-eafp):宽恕请求宽恕而不是权限. (4认同)