python - 为什么托管属性只适用于类属性而不适用于 python 中的实例属性?

标签 python attributes descriptor

为了说明问题,请检查以下代码:

class MyDescriptor(object):
  def __get__(self, obj, type=None):
    print "get", self, obj, type
    return self._v
  def __set__(self, obj, value):
    self._v = value
    print "set", self, obj, value
    return None

class SomeClass1(object):
  m = MyDescriptor()

class SomeClass2(object):
  def __init__(self):
    self.m = MyDescriptor()

x1 = SomeClass1()
x2 = SomeClass2()

x1.m = 1000
# ->  set <__main__.MyDescriptor object at 0xb787c7ec> <__main__.SomeClass1 object at 0xb787cc8c> 10000
x2.m = 1000 # I guess that this overwrites the function. But why?
# ->
print x1.m
# -> get <__main__.MyDescriptor object at 0xb787c7ec> <__main__.SomeClass1 object at 0xb787cc8c> <class '__main__.SomeClass1'> 10000
print x2.m
# -> 10000
  1. 为什么x2.m = 1000不调用__set__函数?看来这会覆盖该功能。但为什么呢?
  2. _v 在 x1 中的什么位置?它不在 x1._v

最佳答案

回答你的第二个问题,_v在哪里?

您的描述符版本将 _v 保留在描述符本身中。描述符的每个实例(类级实例 SomeClass1 和类 SomeClass2 的对象中的所有对象级实例都将具有不同的值 _v.

看看这个版本。此版本更新与描述符关联的对象。这意味着对象(SomeClass1x2)将包含属性 _v

class MyDescriptor(object):
  def __get__(self, obj, type=None):
    print "get", self, obj, type
    return obj._v
  def __set__(self, obj, value):
    obj._v = value
    print "set", self, obj, value

关于python - 为什么托管属性只适用于类属性而不适用于 python 中的实例属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/428264/

相关文章:

python - apache2 和 mod wsgi : Target WSGI script cannot be loaded as Python module

Python Mechanize SelectControl 在它应该有值时为空

c++ - 使用 DWORD 属性从 IShellFolder 获取文件/文件夹属性

c++ - 调试错误 - vector 下标超出范围 - PCL

python - 尝试安装 py -m pip install google-assistant-sdk 时如何修复错误 “ERROR: Command errored out with exit status 1: python.” [示例]

python - 记录类属性

c# - 将属性添加到另一个程序集的类

描述符的 Python 元编程 : How to add descriptor after class definition?

python - 使用 Python 描述符触发类成员的内容

python - 中文的 .format() 问题?