继承不继承,是否有动态创建指向其他class变量的属性?
Inheritance without inheriting, is there create dinamically attributes that point to other class variables?
我正在努力解决这个问题。
我想让名称变量像指向 self.model.name 的值的指针。如果更改 _class.model.name 的值,则 _class.name 应相应更改。
无法找到一种方法来基本上动态映射 Class 属性与任何模型属性而不继承。
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
谢谢!
使用property
创建单个动态计算属性:
class Class(object):
_model_class = Model
@property
def name(self):
return Class._model_class.name
这会导致 Class
的所有实例在查找属性 name
时 运行 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__
仅针对不在 class/instance 上的属性触发。这使得使用手动定义的属性变得相当简单。请注意,您可以使用任意代码来限制获取的内容 - 例如如果 name
不在某个白名单中,则提高 AttributeError
。
连同 MisterMiyagi 的回答 - 但以防万一您仍然希望将问题分开(即使您看起来确实不像)
class Class(object):
model_class = Model
def __init__(self):
self.model = self.model_class()
setattr(self, 'name', self.model.name)
# This is what we'll be changing
@property
def model_name(self):
return self.model.name
# This method will get called whenever we change the model_name
@model_name.setter
def model_name(self, new_name):
self.model.name = new_name
self.name = new_name
_class = Class()
_class.model_name # foo
_class.model_name = "bar" # both _class.model.name == bar and _class.name == bar now
我正在努力解决这个问题。
我想让名称变量像指向 self.model.name 的值的指针。如果更改 _class.model.name 的值,则 _class.name 应相应更改。
无法找到一种方法来基本上动态映射 Class 属性与任何模型属性而不继承。
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
谢谢!
使用property
创建单个动态计算属性:
class Class(object):
_model_class = Model
@property
def name(self):
return Class._model_class.name
这会导致 Class
的所有实例在查找属性 name
时 运行 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__
仅针对不在 class/instance 上的属性触发。这使得使用手动定义的属性变得相当简单。请注意,您可以使用任意代码来限制获取的内容 - 例如如果 name
不在某个白名单中,则提高 AttributeError
。
连同 MisterMiyagi 的回答 - 但以防万一您仍然希望将问题分开(即使您看起来确实不像)
class Class(object):
model_class = Model
def __init__(self):
self.model = self.model_class()
setattr(self, 'name', self.model.name)
# This is what we'll be changing
@property
def model_name(self):
return self.model.name
# This method will get called whenever we change the model_name
@model_name.setter
def model_name(self, new_name):
self.model.name = new_name
self.name = new_name
_class = Class()
_class.model_name # foo
_class.model_name = "bar" # both _class.model.name == bar and _class.name == bar now