Python基础教程 接口和内省

7.2.9 接口和内省

接口这一概念与多态相关。处理多态对象时,你只关心其接口(协议)——对外暴露的方法和属性。在Python中,不显式地指定对象必须包含哪些方法才能用作参数。例如,你不会像在Java中那样显式编写接口,而是假定对象能够完成你要求它完成的任务。如果不能完成,程序将失败。

通常,你要求对象遵循特定的接口(即实现特定的方法),但如果需要,也可非常灵活地提出要求:不是直接调用方法并期待一切顺利,而是检查所需的方法是否存在;如果不存在,就改弦易辙。

>>> hasattr(tc, 'talk')

True

>>> hasattr(tc, 'fnord')

False

在上述代码中,你发现tc(本章前面介绍的TalkingCalculator类的实例)包含属性talk(指向一个方法),但没有属性fnord。如果你愿意,还可以检查属性talk是否是可调用的。

>>> callable(getattr(tc, 'talk', None))

True

>>> callable(getattr(tc, 'fnord', None))

False

请注意,这里没有在if语句中使用hasattr并直接访问属性,而是使用了getattr(它让我能够指定属性不存在时使用的默认值,这里为None),然后对返回的对象调用callable。

注意 setattr与getattr功能相反,可用于设置对象的属性:

>>> setattr(tc, 'name', 'Mr. Gumby')

>>> tc.name

'Mr. Gumby'

要查看对象中存储的所有值,可检查其__dict__属性。如果要确定对象是由什么组成的,应研究模块inspect。这个模块主要供高级用户创建对象浏览器(让用户能够以图形方式浏览Python对象的程序)以及其他需要这种功能的类似程序。有关对象和模块的详细信息,请参阅10.2节

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181030G0DQJM00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券