设置属性而不调用__setattr_()

好吧,我敢肯定答案正好盯着我的脸 - 无论是答案
是"你不能那样做"或"这是非常简单的方式 - 但我被卡住了.
编写一个对象以代理这两个列表(实际上是可订阅的迭代)和
命令.
我的初始看起来像这样:
def __init __(self,obj = none):
如果type(obj).
self.me = []
对于obj中的v:
self.me..append(objectproxy(v))
elif type(obj)== dict:
self.me = {}
对于k,v in obj.items():
self.me [k] = objectproxy(v)
而且我有一个像这样定义的__setattr__:
def __setattr __(自我,名称,值):
self.me [name] = objectproxy(value)
您可能可以看到问题.
在进行初始
然后以无限的循环结束,即使它成功了
self.me ['me'] = {}
首先不是我想要的.
有没有办法定义self.me,而不会发射__setattr__?
如果没有
成为一个问题,但我只是想让它读/写.
谢谢!
J

# 回答1


joshua kugler 使用"对象.__ setattr __(self,'me')= []",同样适用于{}.
# 回答2


4月26日,上午7:01,Joshua Kugler 考虑阅读有关__setattr __的 *第二段 *
3.4.2 Python参考手册.
# 回答3


hrvoje niksic 使用"对象.__ setattr __(self,'me')= []",同样适用于{}.
糟糕,当然应该是"对象.__ setattr __(self,'me',[]).
# 回答4


约翰·马奇(John Machin)写道:
考虑阅读有关__setattr __的 *第二段 *
3.4.2 Python参考手册.
就像我在我的原始帖子中说的那样,它可能正盯着我
脸.我已经阅读了一些有关特殊方法的文档,
但是由于某种原因,我错过了那部分.
感谢您的回答!
J
# 回答5


4月25日,下午5:01,Joshua Kugler 顺便说一句,与您的问题无关,Python鼓励" Duck
输入"而不是确切的类型匹配.除非您有充分的理由
将OBJ限制在您硬编码的5种类型之一中(这是相当罕见的
需要),将其写入:
def __init __(self,obj = none):
如果hasattr(obj,'项目'):
#假设OBJ是映射类型实例
self.me = dict((k,objectproxy(v))for obj.items())
别的:
尝试:#检查OBJ是否是一个可观的实例
self.me = map(objectproxy,obj)
除了typeError:
#在这里处理其他案例
#self.me = ...
这种灵活性的缺点是它可能比它更自由
应该.例如,如果OBJ恰好有一个"项目()"方法
但这并不是真正的映射类型,而是违反了假设. Python
3个通过引入抽象基础来处理这种潜在的歧义
类(ABC)[1]允许课程明确说明其语义.
因此,在py3k中,上面的hasattr()测试宁愿写为
"一世 sinstance(obj,映射)",其中映射是代表的ABC
(仅阅读)映射.
一个更困难的问题是,即使一个班级来自某些
美国广播公司(ABC),您可能并不总是想这样对待其实例.这
典型的陷阱是琴弦是可以的,但是在许多(大多数?)中
应用它们应被视为原子值,而不是序列
字符.因此,在上面的示例中,如果OBJ是字符串,则为self.me
将是每个字符的objectproxy实例列表;大概
不是你打算的.当然,我们可以检查" Isinstance(OBJ,str)"
但是然后我们回到了显式类型检查.没有一般的方法
表达某些内容的"原子价值"也恰好是
具有可观的(但假装不是)",因为它本质上是域 -
依赖.
乔治
[1] http://www.python.org/dev/peps/pep-3119/
# 回答6


joshua kugler [...]
注意可以拼写:
self.me = map(objectproxy,v)
- -
Arnaud
# 回答7


Hrvoje Niksic写道:
使用"对象.__ setattr __(self,'me')= []",同样适用于{}.

糟糕,当然应该是"对象.__ setattr __(self,'me',[]).

# 回答8


考虑阅读有关__setattr __的 *第二段 *
如果您只是要回答RTFM-也可能会将其保留到
你自己.
# 回答9


在文章
Arnaud Delobelle 注意可以拼写:self.me = map(objectproxy,v)
它也可以拼写:
self.me = [obj中的V]
这是我首选的拼写.
- -
aahz(aaxpythoncraft.com)<*http://www.pythoncraft.com/
为什么这个新闻组与所有其他新闻组不同?
# 回答10


在2008年4月26日星期六08:28:38 -0700,AnimalMutha写道:
如果您只是要回答RTFM-也可能会将其保留到
你自己.
是的,但是如果您告诉到底在哪里找到想要的信息
在文档中,就像约翰一样,您正在教OP如何钓鱼.
这是一件好事.无论如何,比您的言论更有帮助.你
也可能把它保留在自己身上. : - -
再见,
marc'blackjack'rintsch
# 回答11

aaxpythoncraft.com(aahz)写道:请注意可以拼写:self.me = map(objectproxy,v)

^ - 我的意思是OBJ!
我在耐心地等待这个答复...和您首选的拼写
当然,也是防PY3K的.
我不编写地图(lambda x:x+1,l)或地图(itemgetter('x'),l),但是我
当第一个参数是命名函数时,喜欢使用它,
例如地图(str,list_of_ints).
- -
Arnaud

# 回答12


AnimalMutha写道:
如果您只是要回答RTFM-也可能会将其保留到
你自己.
就价值而言,我(原始海报)很高兴他回答.
它向我展示了我在阅读时忽略的部分和段落
第一次通过文档.
J

标签: python

添加新评论