MEP13:使用艺术家的属性#
状态#
讨论
分支和拉取请求#
没有任何
摘要#
使用 python属性包装所有 matplotlib getter 和 setter 方法 ,允许它们像类属性一样被读取和写入。
详细说明#
目前 matplotlib 使用 getter 和 setter 函数(通常分别以 get_ 和 set_ 为前缀)来读取和写入与类相关的数据。但是,从 2.6 开始,python 支持属性,允许像属性一样访问这些 setter 和 getter 函数。该提案将实现所有现有的 setter 和 getter 方法作为属性。
实施#
所有现有的 getter 和 setter 方法都需要有两个别名,一个带有 get_ 或 set_ 前缀,一个没有。当前缺少前缀的 Getter 方法应记录在文本文件中。
应该重新组织类,以便 setter 和 getter 方法在代码中是顺序的,首先是 getter 方法。
提供额外可选参数的 Getter 和 setter 方法应该以其他方式访问这些参数,可以作为额外的 getter 或 setter 方法或其他类的属性。如果这些类不可访问,则应为它们添加 getter。
属性装饰器将被添加到不带前缀的 setter 和 getter 方法中。带有前缀的那些将被标记为已弃用。
需要重写文档字符串,因此带有前缀的 getter 具有当前文档字符串,而没有前缀的 getter 具有适用于属性的通用文档字符串。
需要修改自动别名生成,因此它还将为属性创建别名。
getter 和 setter 方法调用的所有实例都需要更改为属性访问。
所有带前缀的 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
, ,... 以显着简化title
从plt
函数到方法的转换。axes
这些仍然是方法,而不是属性,但它仍然是一个很好的可用性增强,同时保留了接口。