通常,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.

因此它不起作用,因为在类型dictionairy中查找的是描述符,而不是对象dictionairy。

有可能的解决方法:
  • 将描述符放入类并使其使用例如obj.xxxattr以存储值。
    如果只有一个描述符行为,则此方法有效。
  • 覆盖 setattr getattr delattr 以响应描述符。
  • 将一个描述符添加到该类中,以响应存储在对象字典中的描述符。
  • 关于python - 创建每个实例的属性描述符?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10436516/

    10-12 21:56
    查看更多