繁体   English   中英

继承而不继承,是否存在创建指向其他类变量的动力学属性?

[英]Inheritance without inheriting, is there create dinamically attributes that point to other class variables?



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

我想让name变量像指向self.model.name值的指针一样 如果_class.model.name的值被改变的_class.name应该随之改变。

无法找到一种方法来基本动态映射Class属性和任何Model属性而不继承。

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

这将导致在查找属性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

连同宫城先生的答案-但如果您仍然想将关注点分开(即使看起来确实不像您那样)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM