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

2024-10-01 13:41:27 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个类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中的这些变量,这样在B中我就可以做到

self.x 

而不是

self.a.x

什么?你知道吗

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

编辑

__dict__基本上带来了一切,包括methodsfunctions,可能只保留数值变量?你知道吗


Tags: self编辑参数键入if定义objectinit
3条回答

你可以写:

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本身中查找属性。你知道吗

(更新为不包括方法):

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
class B(object):
    def __init__(self, a):
        self.__dict__.update(a.__dict__)

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

这将使用与A实例相同的成员名称以及绑定到这些名称的相同值引用来设置B实例。你知道吗

相关问题 更多 >