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对象(如内存文件)或类似对话框的东西来代替真实文件.
在您自己的代码中,只需访问您需要的对象的任何属性,如果它是错误的对象类型,您需要的其中一个属性将不存在,它将抛出异常.
| 归档时间: |
|
| 查看次数: |
303 次 |
| 最近记录: |