所以在python的docutils包中有一个类(Image)有一个方法(对齐)。据我所知,方法将self作为第一个参数,除非它们被装饰为@classmethod或@staticmethod,但是align并不是。相关代码复制在下面(full code here)。
class Image(Directive):
def align(argument):
# This is not callable as self.align. We cannot make it a
# staticmethod because we're saving an unbound method in
# option_spec below.
return directives.choice(argument, Image.align_values)
我使用此代码作为我自己的目的的基础,并且我已经尝试将对齐自我参数并将其转换为静态方法(在更改名称以便不与self.align冲突之后) ),但两种方法都有错误。发生了什么事?
答案 0 :(得分:2)
无需命名第一个参数self
;这只是一个惯例。在以下代码中
i = Image()
i.align()
将使用引用对象align
的参数argument
调用i
方法。
以下功能的行为相同:
def align(self):
return directives.choice(self, Image.align_values)
(只需将argument
替换为更常见的self
)。
在上下文中,函数align
从未打算成为一种方法;作者似乎只是定义了一个存储在options_spec
字典中的函数。通过在保存函数引用后删除名称,可以在不污染类的命名空间的情况下实现所需的效果:
option_spec = {'alt': directives.unchanged,
'height': directives.length_or_unitless,
'width': directives.length_or_percentage_or_unitless,
'scale': directives.percentage,
'align': align,
'name': directives.unchanged,
'target': directives.unchanged_required,
'class': directives.class_option}
del align
或者通过放弃def
语句 - 它是一个非常简单的函数 - 并使用lambda
表达式来创建函数。
option_spec = {'alt': directives.unchanged,
'height': directives.length_or_unitless,
'width': directives.length_or_percentage_or_unitless,
'scale': directives.percentage,
'align': lambda x: directives.choice(x, Image.align_values)
'name': directives.unchanged,
'target': directives.unchanged_required,
'class': directives.class_option}