是否可以使用未绑定的描述符?

2024-10-01 09:29:29 发布

您现在位置:Python中文网/ 问答频道 /正文

(如果没有,是否有一种方法可以完成类似的事情?)你知道吗

例如,下面是一个“绑定”描述符的示例:

class VerboseDescriptor(object):
    def __init__(self, init):
        self.val = init

    def __get__(self, obj, typ=None):
        print("[%s] Get is %s" % (obj, self.val))
        return self.val

    def __set__(self, obj, val):
        print("[%s] Set to %s" % (obj, val))
        self.val = val


class Holder(object):
    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return "Holder(%s)" % self.name

    val = VerboseDescriptor(2)


foo = Holder("foo")
_ = foo.val
foo.val = 4

输出(如预期):

[Holder(foo)] Get is 2
[Holder(foo)] Set to 4

当然,也可以对属性进行类似的操作。你知道吗

但是,在本例中,VerboseDescriptor实例必须是类或实例的属性(在本例中,类Holder)。你知道吗

换句话说,以下不起作用:

class VerboseDescriptor(object):
    def __init__(self, init):
        self.val = init

    def __get__(self, obj, typ=None):
        print("[%s] Get is %s" % (obj, self.val))
        return self.val

    def __set__(self, obj, val):
        print("[%s] Set to %s" % (obj, val))
        self.val = val


val = VerboseDescriptor(2)

_ = val
val = 4

既不调用__get__也不调用__set__方法。在第一行中,_被设置为引用与val相同的VerboseDescriptor实例,在第二行中,val更改为引用4。你知道吗

所以我的问题是,有没有一种方法可以构建一个对象,这样您就可以“捕捉”到它的赋值,就像描述符允许您捕捉到类/实例属性的赋值一样?你知道吗

这个问题更多的是理论问题,而不是实际问题。我知道有一些非常相似的方法涉及到类(类似于我的Holder类),这就足够了。我只是想知道,如果没有Holder类型的类,这个功能是否可行。你知道吗

阅读:


Tags: 实例方法nameselfobjgetobjectfoo