继承输入类的所有活动变量

时间:2012-05-24 21:20:29

标签: python class

想象一下,我有一个班级A

class A(object):
    def __init__(self, x, y)
        self.x = x
        self.y = y

然后我定义了一个由B初始化的类A(而不是以A为基础)和其他参数

class B(object):
    def __init__(self, a):
        if isinstance(a, A):
            self.a = a

问题是,假设A定义了大量变量,并且经常在B中引用,是否有可能B知道A中的变量1}},以便B我能做到

self.x 

而不是

self.a.x

我知道变量的自动继承有点危险,甚至可能具有破坏性,但输入许多额外的self.a.x看起来有点笨拙。可以选择暂时或在小代码片段中打开此继承应该是有用的。

修改

__dict__基本上提出了所有内容,包括methodsfunctions,只能保留数字变量吗?

3 个答案:

答案 0 :(得分:2)

你可以写:

class B(object):
    def __getattr__(self, attr):
        if hasattr(self.a, attr):
            return getattr(self.a, attr)
        else:
            return object.__getattribute__(self, attr)

每当您访问B的属性时,它都会检查a是否具有该属性。如果是这样,它将返回。如果没有,它将在B本身中查找属性。

答案 1 :(得分:1)

(更新为不包括方法):

class B(object):
    def __init__(self, a, g):
        if isinstance(a, A):
            for k,v in a.__dict__.iteritems():
                if not callable(v):
                    self.__dict__[k] = v

答案 2 :(得分:1)

class B(object):
    def __init__(self, a):
        self.__dict__.update(a.__dict__)

Python中的最佳做法通常不是使用isinstance()检查类型,而是使用“duck typing”。我不知道你正在做什么的全部细节,所以我不知道你是否有合理的理由需要isinstance()检查,但我没有它就写了上面的代码。

这会将B的实例设置为与A的实例具有相同的成员名称,并使用与这些名称绑定的相同值引用。