我是一名Java程序员,不熟悉Python。我无法理解GitHub中pymodbus repo中以下代码的语法。函数定义在哪里?
self.execute(request)
我感到困惑的原因是AFAIK self
引用了当前类的变量和函数,甚至是继承的变量和函数。 ModBusClientMixIn类中没有定义函数,类也不从任何其他类继承。那它来自哪里?
ReadCoilsRequest类中定义了execute
函数,但要调用它为什么需要self
?另外,上下文(执行函数参数列表中的变量)来自哪里?
如果有人能帮我理解语法,我真的很感激。
答案 0 :(得分:3)
这是 mixin ,用于做定义execute
方法的类,例如:
class ModbusClientProtocol(protocol.Protocol, ModbusClientMixin):
mixin将方法添加到其他类中,不应该单独使用。
如果你想正确地为它注释,那就必须是:
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和类型注释是一个相对较新的补充,它们经常被省略并被详细的文档所取代,或者预计开发人员会认识到mixin的目的,或者它是这样的内部实现没有明确记录的详细信息。
答案 1 :(得分:2)
这是一个特例。你是对的,execute
必须在某处定义。
但在这种情况下,execute
由来自ModBusClientMixIn
的子类实现。
如果您要直接创建ModBusClientMixIn
的实例,则会收到错误,因为它未实现execute
。
例如,查看ModbusClientProtocol
或BaseModbusClient
的实现,它们都有execute
方法。