【问题标题】:Proper Class and Property Structure正确的类和属性结构
【发布时间】:2018-12-19 12:23:53
【问题描述】:

我了解属性和类如何在 Python 中工作,我能想到的使用属性的最清晰示例是设置温度以使其不低于绝对零。我现在想知道如果方法实际上要进行一些转换,那么使用属性是一个好主意。

从 Wikipedia 获取此属性示例:

class Pen(object):
    def __init__(self):
        self._color = 0 # "private" variable

    @property
    def color(self):
        return self._color

    @color.setter
    def color(self, color):
        self._color = color

假设颜色对于 Pen 的类很重要并且存在于其中是有意义的,但实际的值设置器看起来更像这样:

@color.setter
def color(self, rgb_hex):
    self._color = hex_handler.get_color(rgb_hex)

我喜欢从对象的角度来看,你只是有颜色,但实现对某人来说有点模糊,除非他们深入研究它。那么这是使用属性的好方法还是应该更像:

def set_color_from_rgb_hex(self, rgb_hex):
    self._color = hex_handler.get_color(rgb_hex)

颜色是如何产生的更清楚。

【问题讨论】:

  • 混淆是重点。对用户来说,事情看起来无缝而整洁,因此他们可以编写漂亮、惯用的 Python,而无需处理繁琐的内部结构。如果您不愿意“欺骗”呼叫者了解正在发生的事情,那很好,但您在这里没有违反任何规则。

标签: python python-3.x properties


【解决方案1】:

整个想法正好相反:你不类的用户知道颜色是如何实现的。这就是类和封装的全部意义所在。

用户只是做了一个分配

 my_object.color = 'some_hex_value'

让我们的班级来处理。

属性的想法是你应该使用你的对象成员变量作为公共的,然后定义 getter 和 setter,只有当发生变化时。与例如对比。 java,您可以在其中定义在大多数情况下什么都不做的getter和setter,以防万一发生变化。

如果颜色对你的类那很重要,也许你应该创建一个Color 类,而Pen 类应该只接受它的实例。但是,除非您提供更多信息,否则无法判断。

【讨论】:

    猜你喜欢
    • 2017-05-24
    • 2010-11-24
    • 2020-03-30
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 2011-06-14
    • 2011-03-10
    • 1970-01-01
    相关资源
    最近更新 更多