[英]Python: How to access parent class object through derived class instance?
[英]How to get the name of the instance of the parent class from the derived class in Python?
嗨,我想从继承的子类中获取基类的实例名称。
对于前。
class Foo():
def __init__(self, fakeArg):
self.a = fakeArg
class Bar(Foo):
def __init__(self, fakeArg1):
Foo.__init__(self)
self.b = fakeArg1
# say, i store parent(Foo) instance in an variable too
self.c = f
f = Foo('Hello')
b = Bar('Bar')
现在,我想将“ f”附加(关联)到“ b”,这样,如果我将Bar实例化为b,它还应该存储父类的哪个实例正在调用派生类的实例。
一种实现方法是将父类(Foo)实例“ f”解析为类(Bar)的“ _ init _ ”方法的参数。但是,这有点可笑。
请提供解决问题的方法。
提前致谢。
对您来说,听起来像是骇客,您应该如何去做。
请记住,每个类可能都有大量实例,因此它无法自动知道哪个类应该与之“相关”-并使用各种魔术(例如检查父堆栈框架中是否包含Foo
实例的变量)并希望这是唯一的一个),如果我是你的老板,这将是一个非常丑陋的理由,也是一个让你难对付的理由。
因此,您应该将f
作为参数传递给Bar()
。
如果您不想使用单独的Foo
实例(即,您想要正常继承),则无需创建Foo
实例,只需调用Foo.__init__(self, 'Hello')
或super(Bar, self).__init__('Hello')
在Bar
构造函数中,并且可能接受该值作为参数,而不是对其进行硬编码。
听起来您可能对继承在Python中的工作方式感到困惑。 在您显示的代码中, f
和b
没有关系,只是彼此相邻实例化了。
但是,您的Bar
实例b
确实有权访问Foo
实例,即本身。 通过声明Bar
是Foo
的子类,您是说Bar
每个实例也是Foo
的实例。 您可以使用isinstance(b, Foo)
。
如果您需要从bar
方法访问Foo
定义的变量或方法,通常您可以直接在传递的self
值上直接访问它。 或者,如果您要覆盖Bar
的方法(即,定义一个与Foo
中已经存在的方法同名的方法,则可以使用super
:
class Foo:
def __init__(self, a):
self.a = a
def sayHello(self):
print("Hello!")
class Bar(Foo):
def __init__(self, a, b):
super().__init__(self, a) # calls overridden __init__ method from Foo
self.b = b
def doSomething(self):
self.sayHello() # calls a method defined in Foo
return self.a + self.b # accesses variable "a" that was set in Foo
(请注意,上面的代码是针对Python 3的。有一些小事情会使它在Python 2中无法正常工作。如果您出于维护除旧Python 2应用程序之外的其他原因学习Python,建议您学习Python 3 。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.