使用抽象基类作为函数的参数(Python)
如果我有一个名为使用抽象基类作为函数的参数(Python),python,Python,如果我有一个名为BaseData的抽象基类,它有一个函数update,该函数在其子类中被不同的功能覆盖,那么我可以有一个如下函数:,其中,我希望函数将任何子类作为参数,并为相应的子类调用update函数 def date_func(BaseData, time): result = BaseData.update(time) lastrow = len(result.index) return result['Time'].iloc[lastro
BaseData
的抽象基类,它有一个函数update
,该函数在其子类中被不同的功能覆盖,那么我可以有一个如下函数:,其中,我希望函数将任何子类作为参数,并为相应的子类调用update
函数
def date_func(BaseData, time):
result = BaseData.update(time)
lastrow = len(result.index)
return result['Time'].iloc[lastrow],result['Time'].iloc[lastrow-100]
当然可以。Python不会在意,因为它不做任何类型检查
事实上,您可以使用提供兼容接口的任何类型,这与实例是否来自
BaseData
无关,包括ABC的名称作为参数名称不会将其仅限于ABC的子类。它所做的只是创建一个该名称的参数
任何类型的任何对象都可以作为参数传递给任何函数或方法。在本例中,任何没有update()
的对象都会引发AttributeError
,但如果参数具有可以接受给定参数的update()
方法,则不会导致问题
如果要确定第一个参数是BaseData
的子类,请执行以下步骤:
data
。这将使参数的名称不会在实际的BaseData
类中隐藏(“在此上下文中替换”):
在函数开始处,将已经存在的所有内容都标记为包含在函数中else
子句。如果不执行此操作,则当类型检查失败时,将简单地返回None
try-catch
块中,该块处理错误时引发的异常。这就是我们“请求原谅”的方式
一般来说,如果您要进行类型检查,这是因为您准备处理不同的协议集,并且定义这些协议的ABC也(最好)定义
\uuuuuuu subclasshook\uuuuu()
,以便它不只是检查类是否是“注册”子类,而是遵循规定的方案。您试过了吗?怎么搞的?