这个代码里的执行功能如何被引用?

2024-10-03 23:18:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个Java程序员,对Python还很陌生。我在理解GitHub中pymodbusrepo的以下代码的语法时遇到了问题。函数定义在哪里?你知道吗

self.execute(request)

我感到困惑的原因是AFAIKself引用了当前类的变量和函数,甚至是继承的变量和函数。在ModBusClientMixIn类中没有定义函数,也没有从任何其他类继承的类。那么它是从哪里来的呢?你知道吗

ReadCoilsRequest类中定义了一个execute函数,但是要调用它,为什么需要self?另外,context(execute function参数列表中的变量)来自哪里?你知道吗

如果有人能帮我理解语法,我将不胜感激。你知道吗


Tags: 函数代码selfgithubexecute定义request语法
2条回答

它是一个mixin,用于定义execute方法的类,例如:

class ModbusClientProtocol(protocol.Protocol, ModbusClientMixin):

mixin将方法添加到其他类中,不应该自己使用。你知道吗

如果您想正确地键入annotate,则必须如下所示:

class Executable(ABC):
    @abstractmethod
    def execute(self):
        pass

class ModBusClientMixin:
    def read_coils(self: Executable, address, count=1, **kwargs):
        #          ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
        # Expects self to conform to Executable interface,
        # i.e. to be used in a class that implements execute().
        self.execute()

由于Python严重依赖于duck类型,而类型注释是一个相对较新的添加项,因此它们经常被省略,并被冗长的文档所取代,或者期望开发人员认识到mixin的用途,或者它是一个内部实现细节,以至于它没有被显式地文档化。你知道吗

这是个特例。你是对的,execute必须在某个地方定义。你知道吗

但是在这种情况下,execute是由一个从ModBusClientMixIn派生的子类实现的。你知道吗

如果直接创建ModBusClientMixIn的实例,则会出现错误,因为它没有实现execute。你知道吗

看看ModbusClientProtocolBaseModbusClient的实现,例如,它们都有一个execute方法。你知道吗

相关问题 更多 >