在没有实现getter的情况下引用实例变量有什么问题吗?

时间:2020-04-02 11:02:55

标签: python class

简而言之,我通过API接收json事件,最近我已经在学习有关类的更多知识。推荐的使用类的方法之一是实现getter,setter等。但是,我的类并没有做的太复杂,就是解析json对象中的数据并将格式更好的数据传递到进一步的ETL流程中。 >

下面是我遇到的一个简单示例。

data = {'status': 'ready'}


class StatusHandler:
    def __init__(self, data):
        self.status = data.get('status', None)


class StatusHandler2:
    def __init__(self, data):
        self._status = data.get('status', None)

    @property
    def status(self):
        return self._status


without_getter = StatusHandler(data)
print(without_getter.status)

with_getter = StatusHandler2(data)
print(with_getter.status)

使用StatusHandler类并引用状态实例变量,然后使用该变量将信息传递给其他代码位,我有什么问题吗?我只是想知道随着我的项目变得更加复杂,这是否会成为一个问题,因为尽管我可能是错的,但这似乎不是标准的问题。

1 个答案:

答案 0 :(得分:2)

getter / setter的要点是避免在必须更改实现时以及在不破坏客户端代码的情况下用计算的属性替换普通属性的访问。这仅对不支持计算属性的语言有意义。

Python the descriptor protocol到计算属性的支持非常强,包括通用的内置property类型,因此您不需要显式的getter / setter方法-如果您必须更改您的实现,只需将受影响的公共属性替换为计算的公共属性即可。

请确保不要滥用计算出的属性-它们不应进行任何繁重的计算,外部资源访问等。没有人期望看起来像属性的东西会产生高成本或提高IOError左右;-)

编辑

对于您的示例:计算属性是一种控制属性访问的方法,并且使属性为只读(不为property提供设置器)是一种完全有效的用例-如果您有一个当然使其成为只读的原因。