(如果没有,是否有办法可以完成类似的事情?)
例如,这是一个“绑定”描述符的例子:
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__
方法。在第一行中,_
设置为引用与VerboseDescriptor
相同的val
实例,而在第二行中,val
已更改以引用4。
所以我的问题是,有没有办法构建一个对象,以便你能够“捕获”它的赋值,就像描述符允许你从类/实例属性中捕获赋值一样?
这个问题更具理论性而非实际性。我知道有很多类似的方法涉及类(类似于我的Holder
类)就足够了。我只是想知道在没有Holder
类型类的情况下是否可以实现这一功能。
读: