gpt4 book ai didi

python - 你如何在 python 中验证鸭子类型的接口(interface)?

转载 作者:太空狗 更新时间:2023-10-29 20:50:27 25 4
gpt4 key购买 nike

class ITestType(object):
""" Sample interface type """

__metaclass__ = ABCMeta

@abstractmethod
def requiredCall(self):
return

class TestType1(object):
""" Valid type? """
def requiredCall(self):
pass

class TestType2(ITestType):
""" Valid type """
def requiredCall(self):
pass

class TestType3(ITestType):
""" Invalid type """
pass

在上面的示例中,issubclass(TypeType*, ITestType) 将为 2 返回 true,为 1 和 3 返回 false。

是否有替代方法使用 issubclass,或者接口(interface)测试的替代方法将允许 1 2 通过,但拒绝 3?

能够使用鸭子类型而不是将类显式绑定(bind)到抽象类型对我来说非常有帮助,而且还允许在鸭子类型对象通过特定接口(interface)时进行对象检查。

是的,我知道 python 人不喜欢接口(interface),标准方法是“在失败时找到它并将所有内容包装在异常中”,但也与我的问题完全无关。不,我不能简单地不在这个项目中使用接口(interface)。

编辑:

完美!对于发现此问题的任何其他人,这里是如何使用 subclasshook 的示例:

class ITestType(object):
""" Sample interface type """

__metaclass__ = ABCMeta

@abstractmethod
def requiredCall(self):
return

@classmethod
def __subclasshook__(cls, C):
required = ["requiredCall"]
rtn = True
for r in required:
if not any(r in B.__dict__ for B in C.__mro__):
rtn = NotImplemented
return rtn

最佳答案

查看 ABC module .您可以定义一个抽象基类,它提供一个 __subclasshook__ 方法,该方法根据您喜欢的任何标准定义特定类是否“是抽象基类的子类”——例如“它有方法 X , Y 和 Z"之类的。然后您可以使用 issubclass()isinstance() 来检测类和实例上的接口(interface)。

关于python - 你如何在 python 中验证鸭子类型的接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9223760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com