用附加参数调用python描述符的__get__?

时间:2016-04-07 16:00:57

标签: python python-2.7 python-descriptors

获取描述符时是否可以传递其他参数?

例如,我想:

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作为必需的参数,但无法找出实际提供它的方法吗?

如果没有描述符,是否有另一种方法来实现这种语法?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

if instance is None:
    return self

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

步骤2:访问描述符时,从类而不是实例中获取它:

MyClass.elem1
MyClass.elem1

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

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

丑陋和冗长;尽可能避免。

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