MEP13: 为 Artists 使用属性#

状态#

  • 讨论

分支和 Pull requests#

摘要#

使用 python properties 包装所有 matplotlib 的 getter 和 setter 方法,允许像类属性一样读取和写入它们.

详细描述#

目前,matplotlib 使用 getter 和 setter 函数(通常分别以 get_ 和 set_ 为前缀)来读取和写入与类相关的数据.但是,由于 2.6 版本的 Python 支持属性,它允许像访问属性一样访问这些setter和getter函数.该提案会将所有现有的 setter 和 getter 方法实现为属性.

实施#

  1. 所有现有的 getter 和 setter 方法都需要有两个别名,一个带有 get_ 或 set_ 前缀,一个没有.当前缺少前缀的 Getter 方法应记录在文本文件中.

  2. 应该重新组织类,以便 setter 和 getter 方法在代码中是顺序的,getter 方法在前.

  3. 提供附加可选参数的 Getter 和 setter 方法应该以另一种方式访问这些参数,作为额外的 getter 或 setter 方法,或作为其他类的属性.如果无法访问这些类,则应添加它们的 getter.

  4. 属性装饰器将添加到没有前缀的 setter 和 getter 方法中.带有前缀的将被标记为已弃用.

  5. Docstring 需要重写,以便带有前缀的 getter 具有当前的 docstring,而没有前缀的 getter 具有适用于属性的通用 docstring.

  6. 自动别名生成需要进行修改,以便它也可以为属性创建别名.

  7. 所有 getter 和 setter 方法调用的实例都需要更改为属性访问.

  8. 所有带有前缀的 setter 和 getter 别名都将被删除

以下步骤可以同时完成:1,2 和 3;4 和 5;6 和 7.

只有以下步骤必须在同一版本中完成:4,5 和 6.所有其他更改可以在单独的版本中完成.8 应该在完成所有其他操作后的几个宏版本后完成.

向后兼容性#

所有现有的没有前缀(例如 get_)的 getter 方法都需要从函数调用更改为属性访问.在大多数情况下,这只需要删除括号.

具有附加可选参数的 setter 和 getter 方法需要以另一种方式实现这些参数,作为同一类中的单独属性或作为另一个类的属性或属性.

setter 返回值的情况需要更改为使用 setter 后跟 getter.

存在 set_ATTR_on() 和 set_ATTR_off() 方法的情况将更改为 ATTR_on 属性.

示例#

axes.Axes.set_axis_off/set_axis_on#

当前实现:

axes.Axes.set_axis_off()
axes.Axes.set_axis_on()

新的实现:

True = axes.Axes.axis_on
False = axes.Axes.axis_on
axes.Axes.axis_on = True
axes.Axes.axis_on = False

axes.Axes.get_xlim/set_xlim 和 get_autoscalex_on/set_autoscalex_on#

当前实现:

[left, right] = axes.Axes.get_xlim()
auto = axes.Axes.get_autoscalex_on()

[left, right] = axes.Axes.set_xlim(left=left, right=right, emit=emit, auto=auto)
[left, right] = axes.Axes.set_xlim(left=left, right=None, emit=emit, auto=auto)
[left, right] = axes.Axes.set_xlim(left=None, right=right, emit=emit, auto=auto)
[left, right] = axes.Axes.set_xlim(left=left, emit=emit, auto=auto)
[left, right] = axes.Axes.set_xlim(right=right, emit=emit, auto=auto)

axes.Axes.set_autoscalex_on(auto)

新的实现:

[left, right] = axes.Axes.axes_xlim
auto = axes.Axes.autoscalex_on

axes.Axes.axes_xlim = [left, right]
axes.Axes.axes_xlim = [left, None]
axes.Axes.axes_xlim = [None, right]
axes.Axes.axes_xlim[0] = left
axes.Axes.axes_xlim[1] = right

axes.Axes.autoscalex_on = auto

axes.Axes.emit_xlim = emit

axes.Axes.get_title/set_title#

当前实现:

string = axes.Axes.get_title()
axes.Axes.set_title(string, fontdict=fontdict, **kwargs)

新的实现:

string = axes.Axes.title
string = axes.Axes.title_text.text

text.Text = axes.Axes.title_text
text.Text.<attribute> = attribute
text.Text.fontdict = fontdict

axes.Axes.title = string
axes.Axes.title = text.Text
axes.Axes.title_text = string
axes.Axes.title_text = text.Text

axes.Axes.get_xticklabels/set_xticklabels#

当前实现:

[text.Text] = axes.Axes.get_xticklabels()
[text.Text] = axes.Axes.get_xticklabels(minor=False)
[text.Text] = axes.Axes.get_xticklabels(minor=True)
[text.Text] = axes.Axes.([string], fontdict=None, **kwargs)
[text.Text] = axes.Axes.([string], fontdict=None, minor=False, **kwargs)
[text.Text] = axes.Axes.([string], fontdict=None, minor=True, **kwargs)

新的实现:

[text.Text] = axes.Axes.xticklabels
[text.Text] = axes.Axes.xminorticklabels
axes.Axes.xticklabels = [string]
axes.Axes.xminorticklabels = [string]
axes.Axes.xticklabels = [text.Text]
axes.Axes.xminorticklabels = [text.Text]

替代方案#

除了使用修饰器之外,还可以使用 property 函数.这将改变流程,以便所有缺少前缀的 getter 方法都需要重命名或删除.这使得处理 docstring 更加困难且难以阅读.

没有必要弃用 setter 和 getter 方法,但是保留它们会使代码复杂化.

这也可能成为重写甚至删除自动别名生成的机会.

另一个替代方案:

set_xlim , set_xlabel , set_title 等转换为 xlim , xlabel , title ,...,以使从 plt 函数到 axes 方法的过渡更加简单.这些仍然是方法,而不是属性,但这仍然是一个极大的可用性增强,同时保留了接口.