MEP13:使用艺术家的属性#

状态#

  • 讨论

分支和拉取请求#

没有任何

摘要#

使用 python属性包装所有 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. 需要重写文档字符串,因此带有前缀的 getter 具有当前文档字符串,而没有前缀的 getter 具有适用于属性的通用文档字符串。

  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 和 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 方法都需要重命名或删除。这使得处理文档字符串更加困难和难以阅读。

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

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

另一个替代建议:

set_xlim, set_xlabel,set_title等转换为xlim, xlabel, ,... 以显着简化titleplt 函数到方法的转换。axes这些仍然是方法,而不是属性,但它仍然是一个很好的可用性增强,同时保留了接口。