python类中的实例方法和静态方法

时间:2017-09-26 10:47:04

标签: python class static-methods

所以在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冲突之后) ),但两种方法都有错误。发生了什么事?

1 个答案:

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