自动检测传递给它的另一个属性的名称的描述符?

发布于 2024-09-25 21:47:21 字数 276 浏览 9 评论 0原文

描述符可以自动检测传递给它的对象的名称吗?

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 )

Can a descriptor auto-detect the name of an object passed to it?

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 )

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

忆悲凉 2024-10-02 21:47:21

不,不是真的。您可以通过调用框架的内省来破解一些东西,但这不是一个很好的或强大的解决方案。 (如果 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

No, not really. You can hack something together with introspection of call frames, but it's not a nice -- or robust -- solution. (What would you do if SomeClass had two descriptors, some_attr=MyDecorator() and someother_attr=some_attr??)

It's better to be explicit:

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
秋叶绚丽 2024-10-02 21:47:21

(为后代回答我自己的问题。)

这是迄今为止我想到的最好的:

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")     

(Answering my own question for posterity.)

This is the best I've come up with so far:

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")     
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文