这是我的代码:
class fun:
def __getattr__(self,key):
return self[key]
def __setattr__(self,key,value):
self[key] = value+1
a = fun()
a['x']=1
print a['x']
,错误是:
AttributeError: fun instance has no attribute '__getitem__'
当我将其更改为:
class fun:
def __getattr__(self,key):
return self.key
def __setattr__(self,key,value):
self.key = value+1
a = fun()
a.x=1
print a.x
错误是:
RuntimeError: maximum recursion depth exceeded
我能做什么,我想得到2
答案 0 :(得分:7)
问题是self.key = ...
调用了__setattr__
,所以你最终会进行无限递归。要使用__setattr__
,您必须以其他方式访问对象的字段。有两种常见的解决方案:
def __setattr__(self,key,value):
# Access the object's fields through the special __dict__ field
self.__dict__[key] = value+1
# or...
def __init__(self):
# Assign a dict field to access fields set via __[gs]etattr__
self.attrs = {}
def __setattr__(self,key,value):
self.attrs[key] = value+1
答案 1 :(得分:3)
这是一个错字。
您希望实现特殊方法__setattr__
,而不是__serattr__
,它没有特殊含义。
答案 2 :(得分:1)
首先,该方法称为__setattr__()
。是在尝试进行属性分配时。比如当你这样做时:
self[key] = value+1
...让你的特定电话(无限)递归!
更好的方法是从object
派生你的类,即所谓的new-style class并调用基类:
class fun(object):
def __setattr__(self,key,value):
super(fun, self).__setattr__(key, value + 1)
a = fun()
a.x=1
print a.x
我删除了您的__getattr__()
实施,因为它没有任何价值。