python - 创建每个实例的属性描述符?

标签 python metaprogramming propertydescriptor

通常 Python 描述符被定义为类属性。但就我而言,我希望每个对象实例都具有取决于输入的不同集合描述符。例如:

class MyClass(object):
  def __init__(self, **kwargs):
    for attr, val in kwargs.items():
      self.__dict__[attr] = MyDescriptor(val)

每个对象都有不同的属性集,这些属性是在实例化时决定的。由于这些是一次性对象,因此不方便先对它们进行子类化。

tv = MyClass(type="tv", size="30")
smartphone = MyClass(type="phone", os="android")

tv.size   # do something smart with the descriptor

为对象分配描述符似乎不起作用。如果我尝试访问该属性,我会得到类似的东西

<property at 0x4067cf0>

你知道为什么这不起作用吗?有什么解决办法吗?

最佳答案

这是行不通的,因为您必须将描述符分配给对象的类。

class Descriptor:

    def __get__(...):
        # this is called when the value is got

    def __set__(...
    def __del__(...

如果你写

obj.attr
=> type(obj).__getattribute__(obj, 'attr') is called
=> obj.__dict__['attr'] is returned if there else:
=> type(obj).__dict__['attr'] is looked up
if this contains a descriptor object then this is used.

所以它不起作用,因为查找描述符的是类型字典,而不是对象字典。

有可能的解决方法:

  1. 将描述符放入类中并使其使用,例如obj.xxxattr 来存储值。 如果只有一种描述符行为,则此方法有效。

  2. 覆盖setattrgetattrdelattr以响应描述符。

  3. 将一个描述符放入类中,该类响应存储在对象字典中的描述符。

关于python - 创建每个实例的属性描述符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10436516/

相关文章:

python - 出现错误 "Maximum recursion depth exceeded while calling a Python object"

python - python中的max函数返回错误结果

c# - C# : Automatic ToString Method 中的元编程

c++ - 更新/替换 `boost::hana::map` 中映射值的规范方法

C# - 如何确定属性是否已更改

python - keras的model.fit()和model.evaluate()不一致

python - 使用本地文件套接字的 Python 和 C++ 之间的进程间通信?

c++ - 什么特征/概念可以保证 memsetting 一个对象是明确定义的?

c# - 如何将默认 PropertyDescriptor 设置为属性?

python - 类和实例上的描述符行为差异