MEP13:使用艺术家的属性

状态

  • Discussion

摘要

用python包装所有matplotlib getter和setter方法 properties 允许它们像类属性一样被读写。

详细描述

目前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. 需要重写docstrings,因此前缀为的getter具有当前docstring,而不带前缀的getter具有适合属性的通用docstring。
  6. 自动别名生成将需要修改,因此它还将为属性创建别名。
  7. getter和setter方法调用的所有实例都需要更改为属性访问。
  8. 将删除所有带前缀的setter和getter别名

可以同时执行以下步骤:1、2和3;4和5;6和7。

在同一版本中只能执行以下步骤:4、5和6。所有其他更改都可以在单独的版本中完成。8应该在其他事情发生之后做几个主要的发布。

向后兼容性

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

具有其他可选参数的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 and 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]

选择

也可以使用属性函数,而不是使用修饰符。这将更改过程,以便需要重命名或删除所有缺少前缀的getter方法。这使得处理docstring变得更困难和更难阅读。

不必贬低setter和getter方法,但将它们留在中会使代码复杂化。

这也可以作为重写甚至删除自动别名生成的机会。

另一个备选方案:

转换 set_xlimset_xlabelset_titlexlimxlabeltitle ,…从…过渡 plt 函数到 axes 方法非常简单。这些仍然是方法,而不是属性,但是在保留界面的同时,它仍然是一个很好的可用性增强。