python getattrribute_python试图为动态添加的类重写getattr,但这只是一种工作

本文探讨了Python中实例的__getattr__方法的查找过程,特别是当self.tool是一个类而不是实例时导致的问题。通过创建一个新的类来为self.tool提供__getattr__方法,避免了直接在类上调用此方法的错误行为。同时,文章提醒注意无限递归的潜在风险,并给出了防止这种情况的解决方案。
摘要由CSDN通过智能技术生成

Python在实例的基中寻找特殊的方法,如__getattr____dict__s,不在实例的__dict__中。在

self.tool是一个类。self.tool.test,因此,将调用self.tool的类的__getattr__(它是{}),这不是我们想要的。在

相反,让self.tool成为一个实例,它的类有一个__getattr__:class Foo(object):

def __init__(self):

self.NameList=[]

# add new class to ourself

toolcls = type('tool', (object,), { '__getattr__' : self.__getattr__, } )

self.tool = toolcls()

self.NameList.append( "test" )

# should be called by our newly added "tool" object but is only called sometimes...

def __getattr__(self, attr):

# print("__getattr__: (%s, %s)" % (self.__class__.__name__, attr) )

if( attr in self.NameList ):

return( 99 )

raise AttributeError(" %r object has no attribute %r" % (

type(self).__name__, attr))

foo = Foo()

print( "foo.tool.__getattr__=%d" % foo.tool.__getattr__("test") )

print( "foo.tool.test=%d" % foo.tool.test )

收益率

^{pr2}$

另外,请注意,如果生成Foo的实例而没有定义self.NameList,则上述代码可能导致无限递归。见Ned Batchelder's post on this suprising pitfall。在

为了防止此处出现无限递归,请使用def __getattr__(self, attr):

# print("__getattr__: (%s, %s)" % (self.__class__.__name__, attr) )

if attr == 'NameList':

raise AttributeError()

if( attr in self.NameList ):

return( 99 )

raise AttributeError(" %r object has no attribute %r" % (

type(self).__name__, attr))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值