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
的定义中