描述符可以自动检测传递给它的对象的名称吗?
class MyDecorator( object ):
def __init__(self, wrapped):
# Detect that wrapped's name is 'some_attr' here
pass
class SomeClass( object ):
some_attr = dict()
wrapper = MyDecorator( some_attr )
答案 0 :(得分:2)
不,不是真的。您可以通过内省调用框架来解决问题,但这不是一个好的或强大的解决方案。 (如果SomeClass有两个描述符some_attr=MyDecorator()
和someother_attr=some_attr
,你会怎么做?)
最好是明确的:
def mydecorator(attr):
class MyDecorator( object ):
def __get__(self,inst,instcls):
print(attr)
return MyDecorator()
class SomeClass( object ):
some_attr = mydecorator('some_attr')
someother_attr = mydecorator('someother_attr')
s=SomeClass()
s.some_attr
# some_attr
s.someother_attr
# someother_attr
答案 1 :(得分:-1)
(回答我自己的后代问题。)
这是迄今为止我提出的最好的方法:
class MyDecorator( object ):
def __init__(self, wrapped):
import inspect
for name, obj in inspect.stack(2)[1][0].f_locals.iteritems():
if wrapped is obj:
print "wrapped attribute is called", name
break
else:
raise RuntimeError("Failed to auto-detect attribute name")