【问题标题】:Call python descriptor's __get__ with additional arguments?使用附加参数调用 python 描述符的 __get__?
【发布时间】:2016-07-28 15:33:37
【问题描述】:

获取描述符时是否可以传递额外的参数?

例如,我想要:

class Element(object):
    def __init__(self, text='initial'):
        self.text = text

    def __get__(self, instance, owner, extra_text=''):
        print self.text + instance.name + extra_text

然后就可以像这样使用它了:

class MyClass(object):
    elem1 = Element()
    elem2 = Element(text='override')

    def __init__(self, name):
        self.name = name

    def print_elems(self):
        self.elem1
        self.elem1(extra_text='extra')
        self.elem2
        self.elem2(extra_text='extra')

MyClass('name').print_elems()

然后得到:

initialname
initialnameextra
overridename
overridenameextra

有什么办法可以做到这一点吗?我什至尝试调用elem1.__get__(self, self.__class__, extra_text='extra) 并将extra_text 设置为必需参数,但找不到任何实际提供它的方法?

如果不使用描述符,是否有替代方法来实现此语法?

谢谢!

【问题讨论】:

  • 好吧,如果您将其稍微更改为self.elem1()self.elem1(extra_text='extra'),您基本上已经重新发明了一种方法。 AFAIK 这可能是可能的,但我永远不会那样做。
  • 你绝对不能那样做,因为描述符只有在作为属性访问时才有效(比如self.elem1,而不是普通的elem1)。您可以做的是使描述符的__get__ 返回一个可调用对象,该对象接受您想要的任何参数。但是你想做什么用普通方法做不到的呢?
  • @BrenBarn 我的错,我的意思是self!我试图做的主要事情是在描述符类中获取实例,而不必通过参数传递它。
  • @Bakuriu:我对self.elem1() 语法没问题,但我试图避免使用描述符每次都必须传递self 而不仅仅是能够使用instance .

标签: python python-2.7 python-descriptors


【解决方案1】:

要使用除自动参数以外的任何参数调用 get(),您需要访问描述符的实例。要做到这一点... 第 1 步:作为第一行添加到 get():

if instance is None:
    return self

这是对该方法相当常见的补充。

第二步:访问描述符时,从类而不是实例中获取:

MyClass.elem1
MyClass.elem1

type(my_inst).elem1
type(my_inst).elem1

第 3 步:显式调用 get (),传入所需的参数。

丑陋而冗长;尽量避免。

我出版了一本关于描述符的书,可以在http://www.lulu.com/spotlight/jacobz_20 找到 如果您感到困惑,它真的可以帮助您解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    相关资源
    最近更新 更多