property()用法-这是最好的吗?

你好,
我想管理和控制对几个重要属性的访问
班级并覆盖其中一些的行为
子类.
以下是我在当前如何实现此功能的剥离版本
工作.
它运行得足够好,但是我不禁感觉到更清洁的
可读的方法(少复制等).
这是像它一样好还是可以改进和改进
特别是如果我要添加更多属性
复杂的过度骑行逻辑?
#!/usr/bin/env Python
A类(对象):
def __init __(自我):
self._x =无
self._y =无
def _set_x(self,value):
self._x =值
def _get_x(self):
返回self._x
x =属性(_get_x,_set_x)
def _set_y(self,value):
self._y =值
def _get_y(self):
返回self._y
y =属性(_get_y,_set_y)
B级(A):
def __init __(自我):
self._z =无
super(b,self).__ init __()
def _set_x(self,x):
#示例子类"集"替代.
如果x == 10:
提高异常('%r无效!'%x)
self._x = x
x =属性(a._get_x,_set_x)
def _set_z(self,value):
self._z =值
def _get_z(self):
返回self._z
z =属性(_get_z,_set_z)
del a._get_x,a._set_x,a._get_y,a._set_y
del b._set_x,b._get_z,b._set_z

# 回答1


8月22日,11:18*上午,大卫·莫斯(David Moss) 在Python的范围内,就是这样.
在您不在" get"或" set"上执行代码的情况下,
可能有一个默认的getter/setter,只是设置
变量名的值.这使您的界面保持不变
继承和变化.可以分配默认值
也.
def _set_z(self,value):
self._z =值
#def _get_z(self):
#返回self._z
z =属性(true,_set_z)#Still获取self._z
除非您正在查看"周期性"或常规的东西.从
我正在从事的事情:
def _getBalance(self):
返回self._tree.geti(
self.phere+ self.lookup ['Balance'])
def _getParent(self):
返回self._tree.geti(
self.phere+ self.lookup ['parent'])
"平衡"和"父母"都可以来自仿制药:
ballack =属性(tree_lookup('Balance'))
父=属性(tree_lookup('parent'))
他们将不得不注意正确地定义"自我"和一切.
# 回答2


在2008年8月22日星期五的下午12:18,David Moss 当然可以使它更加简洁,而不会改变含义:
###
从操作员导入attergetter
class attersetter(对象):
def __init __(self,attr):
self._attr = attr
def __call __(self,object,value):
setAttr(对象,self._attr,value)
def defaultproperty(attr):
返回属性(attergetter(attr),attersetter(attr))
A类(对象):
def __init __(自我):
self._x =无
self._y =无
X = DefaultProperty('_ X')
y = defaultproperty('_ y')
B级(A):
def __init __(自我):
super(b,self).__ init __()
self._z =无
def _set_x(self,x):
#示例子类"集"替代.
如果x == 10:
提高例外('%r无效 !' % X)
self._x = x
x =属性(a.x.fget,_set_x)
Z = DefaultProperty('_ Z')
#您真的不需要这样做,但是如果您愿意
del _set_x
###
但是,考虑到您给出的例子,您也可以这样写东西
(除了不再禁止删除属性,这确实
不需要):
###
A类(对象):
def __init __(自我):
self.x =无
self.y =无
B级(A):
def __init __(自我):
super(b,self).__ init __()
self._x = self.x
self.z =无
def _set_x(self,x):
#示例子类"集"替代.
如果x == 10:
提高异常('%r无效!'%x)
self._x = x
x =属性(attergetter('_ x'),_set_x)
###
没有一个
更好地了解您的财产如何相互覆盖.
-imiles
# 回答3


8月22日,下午12:18,大卫·莫斯(David Moss) 就覆盖而言,一个小改进是oproperty食谱:
http://infinitesque.net/articles/2005/enhancing%20python's%20property.xhtml
乔治
# 回答4


大卫·莫斯(David Moss)写道:
Python 2.6中的扩展属性类型使得变得更加容易
覆盖属性的Getter,sett或deleter:http://docs.python.org/dev/library/f...perty#property
C类(对象):
def __init __(self):self._x =无
@财产
def x(self):
"""我是'X'属性."""
返回self._x
@x.setter
def x(自我,价值):
self._x =值
@x.deleter
def x(self):
del self._x
D级(C):
@c.x.getter
def x(self):
返回2 * self._x
@x.setter
def x(自我,价值):
self._x = value // 2
克里斯蒂安
# 回答5


2008年8月22日星期五,下午1:49,Miles 该解决方案非常好,但是在编程中是一个统一的好习惯:
" Attrgetter"的接口是" Def Attrgetter(*名称):..."
因此,对于attersetter来说,这将是相同的:" def attersetter(*名称):"
我将发送一个示例,但要稍微扩展一点并使用
功能编程的一些不错的Python结构:
#<代码>
从操作员导入attergetter
def attersetter(*名称):
def闭合(obj, *values):
对于i在Xrange(len(names))中的我:
setAttr(obj,名称[i],values [i])
返回关闭
attrmanager = lambda名称:( attergetter(name),attersetter(name))
类测试(对象):
x =属性(*attrmanager('_ x'))
y =属性(*attrmanager('_ y'))
setValues = attersetter('x','y')
test = test()
test.x = 1
打印'test.x:',test.x
test.y ='merchise'
打印'test.y:',test.y
#只是另一个测试
test.setValues(3,'Med')
打印'test.x:',test.x
打印'test.y:',test.y
#
问候
# 回答6


8月22日,上午11:18,大卫·莫斯(David Moss) 对OP:您对每个属性执行了一个唯一的过程
一个实例,用于设置,获取和DEL.这是很多代码.如果
您不想要独特的程序,应该遵循哪些模式?
上面的" get_x"的方式有什么问题?什么时候
集思广益,不要将自己限制在python语法上 -
一些东西,我们会写 Python.
# 回答7


castironpi 我还没有看到您为这个小组做出的贡献
被认为是写得很好的python.
是的,令人困惑和边界线发疯了. Pythonic?一点也不.
这是一个提示:尝试实际开发一些现实世界应用程序
python有一段时间,而不是神知识 - 你在做什么
尝试不断劫持各种线程的尝试.您的代码不是
您似乎想像的那样聪明.
# 回答8


8月22日,1:18*下午,大卫·莫斯(David Moss) fwiw,有一个属性()的变体,它允许您重新使用
多个属性的相同getter/setter代码:http://code.activestate.com/recipes/205126/
Raymond Hettinger
# 回答9


8月24日,5:00*am,Alex23 我还没有看到您为这个小组做出的贡献
被认为是写得很好的python.
是的,令人困惑和边界线发疯了. Pythonic?一点也不.
这是一个提示:尝试实际开发一些现实世界应用程序
python有一段时间,而不是神知识 - 你在做什么
尝试不断劫持各种线程的尝试.您的代码不是
您似乎想像的那样聪明.
Python并不像您想象的那么聪明.这是一种语言.你想要一个吗
链接到聪明的代码?我喜欢鼓励创造力.
# 回答10


castironpi 您的另一项非序列回应.在我帖子的这一点上
我对Python的"聪明"提出了任何这样的说法?
如果您写了或发现它很聪明,则不是.
引用克尼根的话:"调试是在编写代码中的两倍
第一位.因此,如果您像巧妙地编写代码
根据定义,您可能不足以调试它."
当相关代码是您的抽象怪兽之一时
经常在此处发布 - 通常是为了响应_new python用户_问
_BASIC_问题_不需要Metaclass Solutions_-我
反复发现解释的成本永远不值得
需要时间和精力.
那你为什么似乎阻碍了它呢?要回去
对您的帖子的回应,并提高"谢谢,这是有道理的!"
回答"我不明白你在这里的意思"吗?
如果您正在认真尝试教育,那么您会失败.如果你是
试图展示你有多聪明,你对此失败了,
也.
当人们似乎通常认为您是马尔可夫·连锁者时 -
应该是一个符合您的沟通清晰度的标志.
# 回答11


8月24日,7:43*pm,Alex23 您的另一项非序列回应.在我帖子的这一点上
我对Python的"聪明"提出了任何这样的说法?
如果您写了或发现它很聪明,则不是.
引用克尼根的话:"调试是在编写代码中的两倍
第一位.因此,如果您像巧妙地编写代码
根据定义,您可能不是SM 足以调试它的艺术."
当相关代码是您的抽象怪兽之一时
经常在此处发布 - 通常是为了响应_new python用户_问
_BASIC_问题_不需要Metaclass Solutions_-我
反复发现解释的成本永远不值得
需要时间和精力.
那你为什么似乎阻碍了它呢?要回去
对您的帖子的回应,并提高"谢谢,这是有道理的!"
回答"我不明白你在这里的意思"吗?
如果您正在认真尝试教育,那么您会失败.如果你是
试图展示你有多聪明,你对此失败了,
也.
当人们似乎通常认为您是马尔可夫·连锁者时 -
应该是一个符合您的沟通清晰度的标志.
我很困惑.我不明白你在写什么.我认为有人在
我的鞋子将其视为恶意或
沟通不畅.我的典型回答是,请我说的话
上下文,并展示其如何满足您描述的标准.
例如,"如果您这样做,我不会喜欢"和"我不认为是
聪明的话,如果您"不是一致的信仰结构,他们是战斗
结构.您已经提出了这样的主张.
在上面的帖子中,我提出了两个主张,问两个问题,并鼓励
头脑风暴.我看不出你怎么说的.
我愿意改变自己的交流方式.我想交流
有效.但是,直到有人想说我想说的话,
说正确的方式,我无法学习如何.所以我等着写python,
并与同龄人分享我的挫败感.
最后,在三段论中,您提出了"不够聪明,可以调试",
您将最大聪明的写作等同于最大聪明的调试,
这显然是错误的.他们是独特的;有人会更好
一个比另一个.此外,您的引用前提是"两次
坚硬的"被假定为,没有证明.
# 回答12


8月25日,12:42*PM,Castironpi 这几乎是我对您的帖子的感觉.
不,这是信号急剧下降的挫败感:这是噪音
自您到达以来,新闻集团就已经进行了.
通常,这是 - 非常困难 - 理解您的背景,因为
初学者.但是,这是怎么回事,您的代码段来自此线程,
您的 - 两个看似独立的回复原始答复
邮政:
在您的"示例"中,您引用一个标记为实施的
属性,两个未指定的属性,一个未指定的方法和一个
未指定的函数.您将一个函数称为" geti"
" geti"使我相信这一点 - 不是可行的代码
只是在没有测试的情况下重新键入此.
我也不知道您在这里要展示什么.它不是
清晰也不明显,我看不到您的方法如何
使用属性定义.
不,我所说的是我还没有看到 - 任何您的代码示例
提供的任何真实,清晰使用 - 任何人 - .这不是一场战斗
结构',这是由压倒性数量形成的意见
您不断为该小组做出贡献的证据.
您说的是:"集思广益时,不要限制自己
Python语法 - 制作
一些东西,我们会写python."
我正在竞争的是您写Python的能力.
此外,人们 - 没有 - 向" Castironpi"发布问题
小时",他们提出问题以帮助他们进一步理解
python,不要给您进一步的机会来强调您的
误会它.暗示他们没有任何
对语言本身的理解,并且您会以某种方式神奇
为他们生成Python代码是根据您在这里写的内容的
可笑.
鉴于有多少人在这个小组上公开杀害了您,我
不确定您认为谁是您的"同龄人".有一个-lot-
您的职位最初挫败感,甚至更多地驳回
作为书写不良的AI实验的输出.
您正在努力 - 图灵测试.如果那不是告诉你什么
您的沟通方式是错误的,我真的不知道会有什么.
由我的编程知识的人承担,我有一个 - 洛特 - 更多
尊重比你的尊重,主要是因为克尼原比
充分证明 - .
这导致我重申我的原始陈述,只是立即制定
作为一个问题:您拥有什么 - 真实的世界应用程序或系统
用 - 任何语言工作?我发现很难相信你
曾经从事任何工作,甚至更明确地工作
其他的现实世界代码.因为您发布的示例代码片段,
当没有破碎时,充其量似乎与您的毫无意义的Wankery有关
代表,没有任何实际应用,最坏的情况
对Python的工作原理进行深刻的误解.
# 回答13


En Mon,2008年8月25日00:41:42 -0300,Alex23 这几乎是我对您的帖子的感觉.
我可以请你们俩私下继续这样做吗?
- -
Gabriel Genellina
# 回答14


8月25日,3:03*PM," Gabriel Genellina"
写道:
当然.但是请注意,如果我,我将继续公开发布
相信有人在这里误导他人,无论是故意还是
不是.
# 回答15


8月24日,10:41*pm,Alex23 这几乎是我对您的帖子的感觉.
好吧.你清楚了.我得到了更好的了解
你对我的问题是.我们拥有的是误解, *不是
战争*.如果您认为我留下了民事论证的理由,请务必
这样说的.否则,我将期待观察,前提,结论.
就像一个好A.I.将. (计算机擅长某种东西,并且
那是逻辑.)
不,这是信号急剧下降的挫败感:这是噪音
自您到达以来,新闻集团就已经进行了.
您还希望将因果关系和/或责备分配.这
证据是情况 l.对不起,你很沮丧.如果我有
负面影响很难证明,这意味着我
有影响力(以不良的方式).我不确定我是否可以接受
我一生的指向.这是一个问题.但是我也觉得我去过
不听我的声音,这只会升级挫败感.
(Google搜索Castironpi+Plonk.Ha.)
在您的"示例"中,您引用一个标记为实施的
属性,两个未指定的属性,一个未指定的方法和一个
未指定的函数.您将一个函数称为" geti"
" geti"使我相信这一点 - 不是可行的代码
只是在没有测试的情况下重新键入此.
它来自真实代码.如果您要链接这样说.这是一个就地
我认为非常漂亮的内存管理器... *和 *功能. *和*
纯Python.
其他人早些时候提出了类似的事情.我的只是更多
专门.
英里:
X = DefaultProperty('_ X')
y = defaultproperty('_ y')
Medardo:
x =属性(*attrmanager('_ x'))
y =属性(*attrmanager('_ y'))
我看到他们和我之间的相似之处,但你只批评
矿.您同意我的类似吗?
如果我愿意说:"在哪里平衡"和"父母"都分享
某些通用的东西",而不是"都可能来自某事
通用",这会更有意义吗?那绝对是
我的错.单词选择绝对是一个弱点,我并不完美.
我的意思是:"这是一个片段,您可以清理一些
抽象."它直接回答了OP的问题:
"它的运作良好,但我不禁感觉到更清洁的
可读的方法(少复制等).这是
很好吗?"
但是我没有很好地组织自己的帖子,所以我可以看到您的困惑.
不,我所说的是我还没有看到 - 任何您的代码示例
提供的任何真实,清晰地用于-onyone-.这不是一场战斗
结构',这是由压倒性数量形成的意见
您不断为该小组做出贡献的证据.
我迷路了.您是否想看一些聪明的代码,即使我写了,
即使我认为这也很聪明?我想要代码审查.
您说的是:"集思广益时,不要限制自己
Python语法 - 制作
一些东西,我们会写python."
我正在竞争的是您写Python的能力.
此外,人们 - 没有 - 向" Castironpi"发布问题
小时",他们提出问题以帮助他们进一步理解
python,不要给您进一步的机会来强调您的
误会它.暗示他们没有任何
对语言本身的理解,并且您会以某种方式神奇
为他们生成Python代码是根据您在这里写的内容的
可笑.
不,这不是我的社论,博客或咨询专栏
我写了多少.集思广益是健康且富有成效的. OP
正在寻找一种改善他写的东西的方法
已经工作了.我敦促他思考 IDE盒子,然后得到
隐喻地帮助"回到盒子".这是不同的
而不是邀请某人集思广益,谁在寻求帮助
"范围"功能,您知道. python使很多事情成为可能
其他语言没有,我不相信任何人都知道
范围.
鉴于有多少人在这个小组上公开杀害了您,我
不确定您认为谁是您的"同龄人".有一个-lot-
您的职位最初挫败感,甚至更多地驳回
作为书写不良的AI实验的输出.
是的,没有开玩笑.我很惊讶自己,但我只是把它归结为我的
在Usenet上是新手,与人不利.我会做的,但是罗马
没有一天建造.我的同龄人是一个不好的人
交流.我应该如何与他建立沟通
还是她?
我知道,感谢该小组,这是错误的.但是我没有
知道这是什么.
[狙击,好吗?]
我的大多数编程是学术研究,学术研究或
业余爱好者.如果您问我是否有经验,是的,我会做.如果
您是在问我是否被迫在
别人的截止日期,不,我没有.这很重要.我不
知道给出我的代码的特征,也许是抽象性,但没有我的
经验不是典型的.学术研究并不是为了
商学院.如果您想要我的凭据,请给我发送电子邮件.我
参加了为期4年的研究1,但我相信人们的工作应该
为自己说话.
我的报价代表向您展示我的代码.可能不是我的简历或工作
历史.公平的?
最后,如果我在新闻组上花费太多时间(2月300日,
哇),也就是说,在这个新闻组上,将其带到
我的注意力.那不是任何人都可以判断的事情
他们自己. (一位著名的哲学家认为朋友是
最严厉的批评家.)有这种意见是可以的,如果您
注意;这并不意味着您也是如此.我可以使用一个
踢在后部分支,也许使我的时间多样化.我
认为我会发现尖头这样说是最有生产力的.
# 回答16


大卫·莫斯(David Moss)
(剪切代码)
请记住,属性没有任何神奇的东西 - 它们只是一个
使用描述符协议的可能(非常方便的)方式
实施计算的属性.如果您必须诉诸于任何不太明显的
技巧或带有属性的样板代码太多,然后是
可能是时候实现自己的自定义描述符对象了.
# 回答17


古老的毕达斯塔斯人,
看起来像是一致投票支持自定义描述符
用于我的目的而不是更通用属性()BIF.
这将使我的图书馆代码非常整洁;-)
非常感谢您的回复.您的帮助很大
赞赏!
P.S.我的帖子是如何点燃迷你火焰战争的?
# 回答18


P.S.我的帖子是如何点燃迷你火焰战争的?
因为Th e回复中的高居民巨魔配额 - 由 这个社区中的一个相当烦人的成员... diez

标签: python

添加新评论