此代码中如何引用此执行函数?
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
.
例如,查看 ModbusClientProtocol
或 BaseModbusClient
的实现,它们都有一个 execute
方法。
我是 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
.
如果直接创建 ModBusClientMixIn
的实例,你会得到一个错误,因为它没有实现 execute
.
例如,查看 ModbusClientProtocol
或 BaseModbusClient
的实现,它们都有一个 execute
方法。