关于class:python类中的实例方法和静态方法

instance methods and static methods in python classes

所以在python的docutils包中,有一个类(image)有一个方法(align)。据我所知,方法将self作为第一个参数,除非它们被修饰为@classmethod或@staticmethod,但Align没有。相关代码复制在下面(此处为完整代码)。

1
2
3
4
5
6
7
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)

我将这段代码用作我自己的基础,并且我尝试了给出Align自变量并将其转换为静态方法(在更改名称以避免与Self.Align冲突之后),但这两种方法都有错误。怎么回事?


没有必要将第一个参数命名为self;这只是一个惯例。在以下代码中

1
2
i = Image()
i.align()

调用align方法时,参数argument引用对象i

以下函数的行为相同:

1
2
def align(self):
    return directives.choice(self, Image.align_values)

(只是简单地用更常见的self替换argument

在上下文中,函数align从未打算是一种方法;作者似乎只是简单地定义了一个要存储在options_spec字典中的函数。通过在保存函数引用后删除名称,可以在不污染类的命名空间的情况下实现所需的效果:

1
2
3
4
5
6
7
8
9
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表达式来创建函数。

1
2
3
4
5
6
7
8
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}