1

想象一下我有一堂课A

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

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

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

问题是,假设A定义了大量变量并且应该B经常引用,是否有可能B知道这些变量A,以便B我可以做到

self.x 

而不是

self.a.x

?

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

编辑

__dict__基本上提出了一切,包括methodsfunctions,可能只保留数值变量?

4

3 回答 3

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自行查找属性。

于 2012-05-24T21:25:19.583 回答
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
于 2012-05-24T21:24:18.153 回答
1
class B(object):
    def __init__(self, a):
        self.__dict__.update(a.__dict__)

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

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

于 2012-05-24T21:25:28.320 回答