Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 此代码中如何引用此执行函数?_Python_Design Patterns_Syntax_Mixins - Fatal编程技术网

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

Python 此代码中如何引用此执行函数?,python,design-patterns,syntax,mixins,Python,Design Patterns,Syntax,Mixins,我是一名Java程序员,不熟悉Python。我很难理解GitHub中repo中以下代码的语法。函数在哪里定义 self.execute(request) 我感到困惑的原因是AFAIKself引用了当前类的变量和函数,甚至是继承的变量和函数。该类中没有定义函数,该类也没有从任何其他类继承。那么它是从哪里来的呢 类中定义了一个execute函数,但是要调用它,为什么需要self?另外,上下文(执行函数参数列表中的变量)来自哪里 如果有人能帮助我理解语法,我将不胜感激。这是一个mixin,用于定义执

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

self.execute(request)
我感到困惑的原因是AFAIK
self
引用了当前类的变量和函数,甚至是继承的变量和函数。该类中没有定义函数,该类也没有从任何其他类继承。那么它是从哪里来的呢

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

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

这是一个mixin,用于定义执行方法的类,例如:

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类型,而类型注释是相对较新添加的,因此它们经常被省略,并被冗长的文档所取代,或者期望开发人员认识到mixin的用途,或者它是一个内部实现细节,没有明确记录。

这是一个特例。您是对的,
execute
必须在某个地方定义

但是在这种情况下,
execute
是由
ModBusClientMixIn
派生的子类实现的

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


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

你是在问为什么要访问你需要的
self.
?你读过这个问题吗?@GiacomoAlzetta也读过这个问题吗?@GiacomoAlzetta是的,我读过关于self的问题,但我的问题是self指的是我所在的当前类或当前范围,在这个范围内,没有定义execute函数。为什么不直接使用
obj.execute
,反正我有一个对那个对象的引用。所以从你的帖子中我可以了解到这一点。execute方法是在ModBusClientProtocol中定义的,ModBusClientProtocol类在定义该方法时实际上会将该方法添加到ModBusClientMixin类中。这对我来说很奇怪,我正在修改一个特定类的行为,而这个类来自另一个以前从未见过的类。我对方法如何声明的理解正确吗?那么上下文变量来自哪里?Python允许多重继承,因此一个类可以从多个父类继承方法
ModBusClientMixin
被用作这样的父级,其目的很可能是在不强制实施强类层次结构的情况下减少代码重复。在其他语言中,你有这种特质。很简单,
ModbusClientProtocol
最终是
protocol.protocol
ModbusClientMixin
的融合,结合两个类的方法并添加自己的方法。就像我在另一个答案的注释中提到的那样-执行类似于java中的抽象方法吗?是的,所以它类似于java中的抽象方法,对吗?