Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 继承输入类的所有活动变量_Python_Class - Fatal编程技术网

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

Python 继承输入类的所有活动变量,python,class,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中频繁引用,是

假设我有一个类
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
看起来有点笨拙。可以选择暂时或在小代码段中打开此继承,这应该很有用

编辑

\uuuu dict\uuuuuuuuuuuuu
基本上提供了所有内容,包括
方法
函数
,可以只保留数值变量?

(更新为不包括方法):

(更新为不包括方法):

你可以写:

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 __getattr__(self, attr):
        if hasattr(self.a, attr):
            return getattr(self.a, attr)
        else:
            return object.__getattribute__(self, attr)
class B(object):
    def __init__(self, a):
        self.__dict__.update(a.__dict__)
无论何时访问
B
的属性,它都会检查
a
是否具有该属性。如果是这样,它将返回该值。如果没有,它将在
B
本身中查找属性

class B(object):
    def __init__(self, a):
        self.__dict__.update(a.__dict__)
Python中的最佳实践通常不是使用
isinstance()
检查类型,而是使用“duck typing”。我不知道您正在做什么的全部细节,因此我不知道您是否有合法的理由需要检查
isinstance()
,但是我编写了上面的代码,没有检查

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

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


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

复制
\uuuu dict\uuu
非常接近,但请查看我修订的问题:更喜欢只继承数值变量(数字和数组).复制
\uuuu dict\uuuuu
非常接近,但请看看我的修订问题:更喜欢只继承数字变量(数字和数组)。虽然其他两个答案可能是最奇特和最简单的,但这是迄今为止最灵活的。而对
a
的更新也会在
b
中自动“更新”。我主要想在
b
内部使用
a
,而不是在
b
外部访问,它是这样工作的吗?是的,因为当你用
b
的方法编写
self.foo
时,Python将调用
\uuuu getattr\uuuu
来查找属性,这意味着上面的代码将运行。我刚刚检查了getattr的文档,似乎Python只会在
B
中不容易定义attr的情况下进行此操作,我现在有点困惑,python到底什么时候会触发这种方法。虽然其他两个答案可能是最奇特和最简单的,但这是迄今为止最灵活的。而对
a
的更新也会在
b
中自动“更新”。我主要想在
b
内部使用
a
,而不是在
b
外部访问,它是这样工作的吗?是的,因为当你用
b
的方法编写
self.foo
时,Python将调用
\uuuu getattr\uuuu
来查找属性,这意味着上面的代码将运行。我刚刚检查了getattr的文档,似乎Python只会在
B
中不容易定义attr的情况下进行此操作,我现在有点困惑,python什么时候会触发这个方法。谢谢你提醒我oop中的duck类型练习。我在这里使用实例检查,因为在我的源代码中,
A
实际上是非常具体的,我只想在
B
的定义中使用
A
,谢谢你提醒我oop中的duck打字练习。我在这里使用实例检查,因为在我的源代码中
A
实际上是非常具体的,我只希望
A
B
的定义中