Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 引用实例变量而不实现getter是否有问题?_Python_Class - Fatal编程技术网

Python 引用实例变量而不实现getter是否有问题?

Python 引用实例变量而不实现getter是否有问题?,python,class,Python,Class,简而言之,我通过API接收json事件,最近我学到了很多关于类的知识。使用类的推荐方法之一是实现getter、setter等。。然而,我的类并不太复杂,它们所做的只是解析来自json对象的数据,并将格式更好的数据传递给进一步的ETL进程 下面是我遇到的一个简单例子 data = {'status': 'ready'} class StatusHandler: def __init__(self, data): self.status = data.get('statu

简而言之,我通过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并引用状态实例变量并使用该变量将信息转发给其他代码位,是否有任何问题?我只是想知道,随着我的项目变得越来越复杂,这是否会成为一个问题,因为它似乎不是标准的,尽管我可能是错的…

getter/setter的目的是避免在必须更改客户端代码的情况下,用计算属性替换普通属性访问而不破坏客户端代码实施这只适用于不支持计算属性的语言

Python对计算属性thru提供了相当强大的支持,包括通用内置的
属性
类型,因此您不需要显式的getter/setter-如果您必须更改实现,只需将受影响的公共属性替换为计算属性即可

只要确保不要滥用计算属性——它们不应该进行任何繁重的计算、外部资源访问等等。没有人期望看起来像属性的东西会有高成本或引发IOErrors等等;-)

编辑


关于您的示例:计算属性是控制属性访问的一种方法,将属性设置为只读(不为
属性提供setter
)是一个非常有效的用例—当然,如果您有理由将其设置为只读的话

getter/setter的要点是避免在必须更改实现时,在不破坏客户机代码的情况下,将普通属性访问替换为计算属性访问。这只适用于不支持计算属性的语言

Python对计算属性thru提供了相当强大的支持,包括通用内置的
属性
类型,因此您不需要显式的getter/setter-如果您必须更改实现,只需将受影响的公共属性替换为计算属性即可

只要确保不要滥用计算属性——它们不应该进行任何繁重的计算、外部资源访问等等。没有人期望看起来像属性的东西会有高成本或引发IOErrors等等;-)

编辑


关于您的示例:计算属性是控制属性访问的一种方法,将属性设置为只读(不为
属性提供setter
)是一个非常有效的用例—当然,如果您有理由将其设置为只读的话

“使用类的推荐方法之一是实现getter、setter等…”不,不是用Python。
property
的全部要点是不必编写样板文件的getter和setter。除非你的getter和setter真的做了些什么,否则不要让属性不确定你在读什么代码,但是看看python标准库,你永远不会看到毫无意义的getter和setter。这不是python的方式。这不是Java。如果您想执行一些额外的逻辑,getter和setter是相关的。例如,检查设定值是否为有效值(必须是一个数字,在某个范围内,等等)。如果要记录信息,也可能与此相关。但是,如果您不介意,直接寻址就可以了。@TinNguyen显式getter/setter在Python中仍然是不相关的-我们对此有计算属性。请注意,这两个类是不等价的。在第二种情况下,属性是不可设置的。这是定义一个简单的
属性
的有效用例,该属性只返回
self.\u一些变量
,但如果这不是您想要的,请使用第一个版本。“使用类的推荐方法之一是实现getter、setter等…”不,不是在Python中。
property
的全部要点是不必编写样板文件的getter和setter。除非你的getter和setter真的做了些什么,否则不要让属性不确定你在读什么代码,但是看看python标准库,你永远不会看到毫无意义的getter和setter。这不是python的方式。这不是Java。如果您想执行一些额外的逻辑,getter和setter是相关的。例如,检查设定值是否为有效值(必须是一个数字,在某个范围内,等等)。如果要记录信息,也可能与此相关。但是,如果您不介意,直接寻址就可以了。@TinNguyen显式getter/setter在Python中仍然是不相关的-我们对此有计算属性。请注意,这两个类是不等价的。在第二种情况下,属性是不可设置的。这是定义一个简单的
属性
的有效用例,该属性只返回
self.\u一些变量
,但如果这不是您想要的,请使用第一个版本。