gpt4 book ai didi

python - 继承不继承,是否有动态创建指向其他类变量的属性?

转载 作者:行者123 更新时间:2023-12-01 01:30:47 30 4
gpt4 key购买 nike



我正在努力解决这个问题。

我希望 name 变量像一个指向 self.model.name 值的指针。如果 _class.model.name 的值发生更改,_class.name 也应相应更改。

无法找到一种在不继承的情况下将类属性与任何模型属性动态映射的方法。

class Model(object):

name = 'foo'
parent = 'foo_p'

class Class(object):

model_class = Model

def __init__(self):

self.model = self.model_class()

setattr(self, 'name', self.model.name)

_class = Class()
print _class.model.name # foo

_class.model.name = 'foo_1'
print _class.name # this should be foo_1

谢谢!

最佳答案

使用属性创建单个动态计算的属性:

class Class(object):
_model_class = Model

@property
def name(self):
return Class._model_class.name

每当查找属性 name 时,这都会导致 Class 的所有实例都运行 name 方法。这允许在每次查找时动态计算值。

_class = Class()
print(_class.name) # 'foo'
Model.name = 'bar'
print(_class.name) # 'bar'
<小时/>

如果您想从其他地方动态获取许多或所有属性,请考虑使用 __getattr__ :

class Class(object):
_model_class = Model

def __getattr__(self, name):
# name is a *string* containing the name of the attribute to fetch
return getattr(Class._model_class, name)

只有不在类/实例上的属性才会触发__getattr__。这使得使用手动定义的属性变得相当简单。请注意,您可以使用任意代码来限制获取的内容 - 例如如果 name 不在某个白名单中,则引发 AttributeError

关于python - 继承不继承,是否有动态创建指向其他类变量的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52896244/

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