python __getattr__和__name__

时间:2012-03-17 15:45:03

标签: python

我在Python 2.6中使用“新样式”类,并且在子类中遇到__getattr__问题。

如果子类实现如此......

def __getattr__(self, name):
    if self.__folderDict.has_key(name):
        if name == 'created':
            return doSomethingSpecial(self.__folderDict[name])
        return self.__folderDict[name]
    else:
        raise AttributeError()

我不清楚为什么我的属性异常会被引发以引用__name__?

我的理解是__getattr__甚至不应该调用__getattribute__应该填充__name__,因为我正在使用新的样式?

这是一个更完整的例子......

class Base(object):
    @staticmethod
    def printMsg(msg, var):
        print msg + str(var)
        return

    def printName(self):
        Base.printMsg('#', self.__name__)
        return

class Derived(Base):
    def __getattr__(self, name):
        if self.__testDict.has_key(name):
            return self.__testDict[name]
        else:
            raise AttributeError()

    __testDict = {'userid': 4098}


d = Derived()
print d.userid
d.printName()

结果是......

4098
Traceback (most recent call last):
File "D:/.../Scratch/scratch01.py", line 24, in <module>
d.printName()
File "D:/.../Scratch/scratch01.py", line 17, in __getattr__
raise AttributeError()
AttributeError

2 个答案:

答案 0 :(得分:1)

__name__是为类对象预定义的,而不是实例,并且在尝试读取之前没有在任何地方定义__name__。因此调用_getattr__(因为__name__无法通过正常查找找到)并导致异常。我怀疑你真正想要的是:

...
def printName(self):
    Base.printMsg('#', self.__class__.__name__)
    return
...

答案 1 :(得分:-1)

编辑:啊,好的。正如TokenMacGuy所说,只有在正常的属性查找不成功时才会调用 getattr 。我试了但是忘了添加__folderDict属性。

您是否拥有自己的 getattribute 方法?