此代码中如何引用此执行函数?

How is this execute function referenced in this code?

我是 Java 程序员,刚接触 Python。我无法理解 GitHub 中 pymodbus 存储库中以下代码的语法。函数定义在哪里?

self.execute(request)

我感到困惑的原因是 AFAIK self 指的是当前 class 的变量和函数,甚至是继承的。 ModBusClientMixIn class 中没有定义函数,class 也没有从任何其他 class 继承。那么它来自哪里?

ReadCoilsRequest class 中定义了一个 execute 函数,但要调用它,为什么需要 self?另外,上下文(执行函数参数列表中的变量)来自哪里?

如果有人能帮助我理解语法,我将不胜感激。

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

class ModbusClientProtocol(protocol.Protocol, ModbusClientMixin):

mixin 将方法添加到其他 类 并且不应该被自己使用。

如果你想type-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-typing 并且类型注释是相对较新的添加,它们经常被省略并被冗长的文档所取代,或者期望开发人员认识到 mixins 的目的,或者它是一个内部实现细节,尚未明确记录。

这是一个特例。你是对的,execute 必须在某处定义。

但在这种情况下,execute 是由派生自 ModBusClientMixIn.

child class 实现的

如果直接创建 ModBusClientMixIn 的实例,你会得到一个错误,因为它没有实现 execute.

例如,查看 ModbusClientProtocolBaseModbusClient 的实现,它们都有一个 execute 方法。