【问题标题】:python __getattr__ and __name__python __getattr__ 和 __name__
【发布时间】:2012-03-17 15:45:03
【问题描述】:

我在 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__ 甚至不应该被调用,并且 __name__ 应该由 __getattribute__ 填充,因为我使用的是新样式?

这里有一个更完整的例子...

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

【问题讨论】:

  • 能否显示实际调用代码和回溯?
  • 同意前面的评论,您的信息不是很详细和清楚,人们在写答案时可能会感到困惑。但是根据你对getattrgetattribute的理解,this post好像对你有用。

标签: python


【解决方案1】:

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

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

【讨论】:

  • 我没有意识到这一点。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 2018-10-22
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 2017-10-25
相关资源
最近更新 更多