gpt4 book ai didi

Python:将属性添加到类的变量并使其在分配(描述符类)中存活

转载 作者:太空宇宙 更新时间:2023-11-04 05:20:50 29 4
gpt4 key购买 nike

我们的项目从一堆不同的来源收集关于一个对象的一堆信息,为了审计和解决我们的数据源之间的冲突,我们需要保留一堆关于每个属性的元数据

age = 21
age_metadata = {
'source' : 'office gossip',
'relability' : 0
{

问题是类开始看起来像这样。

class Person
def __init__(self, id, ):
self.id = id
self.id_meta = None
self.age = None
self.age_meta = None
self.name = None

这看起来很难看,而且所有东西的属性数量都翻了一番,所以我想要的是将元数据嵌套在每个属性下。因此,如果我需要它,我可以调用 bob.age.meta 而不是 bob.age_meta 并且我想在保持属性或多或少不变的情况下执行此操作。所以我想要一些我经常使用的东西,比如:

def main():
bob = Person(1)
bob.age.meta = 'random metadata'
bob.age = 30
assert bob.age.meta == 'random metadata'

现在我认为这应该可以使用描述符类的组合来拦截分配 + 一些猴子修补/元类魔术来保留元数据..但我对所有这些功能都是新的并且我变得非常迷茫。这是我目前的 sketch.long 从工作代码开始的方式:

class AttributeWithMeta(object):
"""interceot attribute fucntions"""

def __get__(self, instance, owner):
return self._value

def __set__(self, instance, value):
"""take attribute and somehow replace it with monkey patched version"""
self._value = magic(value,meta)

@staticmethod
def magic(value, meta):
"""adds meta attribute to objects regardless of type"""
return value_with_meta


class Person(object):
age = AttributeWithMeta()

def __init__(self, id):
self.id = id

我的方向是否正确?还有其他方法可以做到这一点吗?我是不是想在这里做不可能的事情?

如果属性有问题,P.S 最坏情况 age.get_meta() 是可以接受的。

最佳答案

bob.age.meta
^ ^
| |_______ This lookup can be managed by type(bob.age) class
|
|___________ This lookup can be managed by type(bob) class, i.e. Person

.meta 的属性访问完全由 bob.age 对象处理,因此您的 Person 类在这件事上没有发言权这里。

通过在 Person 类上定义描述符,您可以控制设置/获取/删除 age 属性在 Person 实例上的行为方式。你own the dot在一个人实例和一个属性之间,并且可以在那里做任何你想做的事情。但是这种力量没有达到第二个点 - 即 agemeta 之间的 .

如果你想让 bob.age 返回整数 30,那么你将很难让 bob.age.meta 做任何事情,除了提高属性错误。那是因为现在您需要在 int 类上定义一个描述符,而猴子修补内置类型在 python 中是不可能的。并非没有terrible and unreliable hacks , 反正。

如果您很高兴 bob.age 返回某种对象容器和关联的元数据,那么您想要的可以通过 Person 上的描述符实现类(class)。但是,如果您希望 bob.age 仅返回对象,而 bob.age.meta 仅返回元数据,那么我认为您找错了树.

一个简单得多的设计是让每个 Person 实例直接有一个 meta 字典,这样你就可以查找例如 bob.meta[ 'age'] 用于与 bob 的 age 属性相关的元数据。

关于Python:将属性添加到类的变量并使其在分配(描述符类)中存活,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40405390/

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