gpt4 book ai didi

python - 为什么不调用 Python 描述符 __set__

转载 作者:太空狗 更新时间:2023-10-30 00:33:01 25 4
gpt4 key购买 nike

我有一个类的描述符,但它的 __set__ 方法没有被调用。几个小时以来,我一直在努力寻找这个问题,但对此没有任何答案。但我在下面注意到的是,当我将 12 分配给 MyTest.X 时,它会删除 X 的属性描述符,并将其替换为值 12。因此调用 Get 函数的打印语句。那很好。

但是 __set__ 函数的打印语句根本没有被调用。我错过了什么吗?

class _static_property(object):
''' Descriptor class used for declaring computed properties that don't require a class instance. '''
def __init__(self, getter, setter):
self.getter = getter
self.setter = setter

def __get__(self, instance, owner):
print "In the Get function"
return self.getter.__get__(owner)()

def __set__(self, instance, value):
print "In setter function"
self.setter.__get__()(value)

class MyTest(object):
_x = 42

@staticmethod
def getX():
return MyTest._x

@staticmethod
def setX(v):
MyTest._x = v

X = _static_property(getX, setX)


print MyTest.__dict__
print MyTest.X
MyTest.X = 12
print MyTest.X
print MyTest.__dict__

最佳答案

另外两个答案暗示使用元类来完成你想做的事情。为了帮助了解它们,下面是一个将一个应用到您问题中的代码以使其执行您想要的操作的示例:

class _static_property(object):
"""Descriptor class used for declaring computed properties that
don't require a class instance.
"""
def __init__(self, getter, setter):
self.getter = getter
self.setter = setter

def __get__(self, obj, objtype=None):
print("In the getter function")
return self.getter(obj)

def __set__(self, obj, value):
print("In setter function")
self.setter(obj, value)

class _MyMetaClass(type):
def getX(self):
return self._x

def setX(self, v):
self._x = v

X = _static_property(getX, setX)

class MyTest(object):
__metaclass__ = _MyMetaClass # Python 2 syntax
_x = 42

#class MyTest(object, metaclass=_MyMetaClass): # Python 3 (only) syntax
# _x = 42

print(MyTest.__dict__)
print(MyTest.X)
MyTest.X = 12
print(MyTest.X)
print(MyTest.__dict__)

类是其元类的实例,通常类型为 type。但是,您可以将其用作基类并派生您自己的专用元子类——在这种情况下,元子类具有类属性,这些属性是数据描述符(也称为属性)。请注意,元类或元子类方法中的 self 参数是一个元类实例,它是一个类。在上面的代码中,它被命名为 MyTest

关于python - 为什么不调用 Python 描述符 __set__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18133793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com