我是靠谱客的博主 忧心学姐,最近开发中收集的这篇文章主要介绍python属于私有属性_Python中的“私有”属性属性,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

我对

Python比较陌生,所以我希望我没有错过任何东西,但是这里……

我正在尝试编写一个Python模块,并且我想创建一个具有“私有”属性的类,该属性可以(或者可能“应该”)仅通过模块中的一个或多个函数进行修改.这是为了使模块更加健壮,因为在这些函数之外设置此属性可能会导致不必要的行为.例如,我可能有:

>存储散点图数据的x和y值的类

>一个从文件中读取x和y值并将它们存储在类中的函数read()

>绘制它们的函数,plot()

在这种情况下,我更喜欢用户无法做到这样的事情:

data = Data()

read("file.csv", data)

data.x = [0, 3, 2, 6, 1]

plot(data)

我意识到在名称中添加一个前导下划线表示用户不应更改该属性,即重命名为_x并添加属性装饰器,以便用户可以访问该值而不会感到内疚.但是,如果我想添加一个setter属性呢:

class Data(object):

_x = []

_y = []

@property

def x(self):

return self._x

@x.setter

def x(self, value):

# Do something with value

self._x = value

我现在处于与以前相同的位置 – 用户无法再直接访问属性_x,但他们仍然可以使用以下方式设置它:

data.x = [0, 3, 2, 6, 1]

理想情况下,我将属性函数定义重命名为_x(),但这会导致混淆self._x实际意味着什么(取决于它们被声明的顺序,这似乎导致setter被递归调用或者setter被忽略,有利于属性).

我能想到的几个解决方案:

>在属性__x中添加一个双前导下划线,以便名称变得严重,并且不会与setter函数混淆.据我了解,这应该保留给类不希望与可能的子类共享的属性,所以我不确定这是否是合法用途.

>重命名属性,例如_x_stored.虽然这完全解决了这个问题,但它使代码更难阅读并引入了命名约定问题 – 我要重命名哪些属性?只是那些相关的?只是有财产的?只是这堂课的那些?

以上哪种解决方案都适用?如果没有,有没有更好的方法来解决这个问题?

编辑

感谢到目前为止的回复.评论提出几点意见:

>我想保留setter属性给我的额外逻辑 – 在上面的例子中#Dothing with value部分 – 所以通过直接访问self._x来内部设置属性并不能解决问题.

>删除setter属性并创建单独的函数_set_x()确实解决了问题,但它不是一个非常简洁的解决方案,因为它允许以两种不同的方式设置_x – 通过调用该函数或通过直接访问self._x.然后,我必须跟踪哪些属性应该由他们自己的(非属性)setter函数设置,哪些属性应该通过直接访问来修改.我可能宁愿使用我上面提到的解决方案之一,因为尽管它们在类中混淆了命名约定,但它们在类之外的使用中至少是一致的,即它们都使用属性的语法糖.如果没有办法以更简洁的方式做到这一点,那么我想我只需选择导致破坏最少的那个.

最后

以上就是忧心学姐为你收集整理的python属于私有属性_Python中的“私有”属性属性的全部内容,希望文章能够帮你解决python属于私有属性_Python中的“私有”属性属性所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部