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

时间:2018-03-08 09:54:15

标签: python design-patterns syntax mixins

我是一名Java程序员,不熟悉Python。我无法理解GitHub中pymodbus repo中以下代码的语法。函数定义在哪里?

self.execute(request)

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

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

如果有人能帮我理解语法,我真的很感激。

2 个答案:

答案 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

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