1

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

例如,我想要:

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所需的参数,但无法找到任何实际提供它的方法?

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

谢谢!

4

1 回答 1

0

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

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找到 。如果你感到困惑,它真的可以帮助你解决这个问题。

于 2016-04-08T03:58:09.933 回答