0

我想将一个可调用类分配为另一个类的函数,然后从拥有的函数中引用所有者类:

class DoIt(object):

    def __call__(self):
        print "%s did it" % self.name

class Doer(object):

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

    doSomething = DoIt()


doer = Doer("Bob")
doer.doSomething()

在上面的代码中,我希望doSomething()函数打印“Bob did it”,但是使用这段代码我会得到一个

AttributeError:“DoIt”对象没有属性“名称”

因为 self 引用 DoIt 实例,而不是 Doer 实例。是否可以引用 Doer 实例?

4

3 回答 3

4
class DoIt(object):

    def __get__(self, instance, owner):
        def done():
            print "%s did it" % instance.name
        return done

class Doer(object):

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

    doSomething = DoIt()


doer = Doer("Bob")
doer.doSomething()

解释:( 这是提问者尽其所能解释这个答案)

Python 为您提供描述符类,它们是充当属性的类(与作为实例变量或属性的属性相反)。描述符类的__get__方法决定了当该类作为另一个类的属性被分配和访问时返回的内容。并__get__允许您访问拥有的实例和拥有的类(参见方法签名)。

通过__get__返回一个函数,您实际上创建了一个可以访问其所有者的可调用对象。

有关描述符的更多信息,请参阅Attributes, Properties and Descriptors - Building Skills in Python

于 2012-05-02T20:47:37.277 回答
2

这是实现此目的的一种方法:

class DoIt(object):
    def __init__(self, obj):
        self.obj = obj

    def __call__(self):
        print "%s did it" % self.obj.name

class Doer(object):
    def __init__(self, name):
        self.name = name
        self.doSomething = DoIt(self)

doer = Doer("Bob")
doer.doSomething()    # prints 'Bob did it'
于 2012-05-02T20:32:03.507 回答
0

这纯粹是 Ignacio 回答的另一个例子——当“可调用”需要参数时,我想展示相同的概念。

class DoIt(object):

    def __get__(self, instance, owner):

        def done(what):
            print "%s did something %s" % (instance.name, what)
        return done

class Doer(object):

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

doer = Doer("Bob")
doer.doSomething("cool")

印刷:

鲍勃做了一件很酷的事

于 2012-05-03T12:20:41.693 回答