__setattr__在这个python代码中做了什么?

时间:2011-03-19 09:35:04

标签: python get set

这是我的代码:

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

3 个答案:

答案 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__()实施,因为它没有任何价值。