Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用抽象基类作为函数的参数(Python)_Python - Fatal编程技术网

使用抽象基类作为函数的参数(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
    类中隐藏(“在此上下文中替换”)
  • 如果isinstance(data,BaseData),则写入
    在函数开始处,将已经存在的所有内容都标记为包含在函数中
  • (可选)编写引发错误的
    else
    子句。如果不执行此操作,则当类型检查失败时,将简单地返回
    None
  • 既然你知道如何去做你要做的事情,你应该意识到很少有值得去做的事情。同样,任何满足所需“协议”的对象都可以工作,不一定是ABC的子类

    这遵循了python的“请求原谅比请求允许更容易”(或EAFTP)原则,这让我们假设传递参数的人给出了一个兼容类型的参数。如果您担心可能有人输入了错误的类型,那么可以将代码包装在
    try-catch
    块中,该块处理错误时引发的异常。这就是我们“请求原谅”的方式


    一般来说,如果您要进行类型检查,这是因为您准备处理不同的协议集,并且定义这些协议的ABC也(最好)定义
    \uuuuuuu subclasshook\uuuuu()
    ,以便它不只是检查类是否是“注册”子类,而是遵循规定的方案。

    您试过了吗?怎么搞的?