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