您好我想从继承的子类中获取基类的实例名称。
代表
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”解析为类的“ _ init _ ”方法的参数(Bar)但是,这是一种黑客攻击。
请提供问题的解决方案。
提前致谢。
答案 0 :(得分:2)
听起来像是黑客攻击你应该怎么做。
请记住,每个类可能有大量实例,因此不能自动知道哪个应该与之“相关” - 并使用任何种类的魔法(例如检查父级)如果我是你的老板,那么持有一个Foo
实例的变量的堆栈框架并希望这是唯一的一个)会非常难看,并且有理由对你施以压力。
因此,您应将f
作为参数传递给Bar()
。
如果您不想要单独的Foo
实例 - 即您想要正常继承 - 则无需创建Foo
的实例,只需调用Foo.__init__(self, 'Hello')
或{{1}在super(Bar, self).__init__('Hello')
构造函数中,可能接受该值作为参数而不是硬编码。
答案 1 :(得分:2)
听起来你可能会对Python中的继承如何工作感到困惑。在您显示的代码中,f
和b
不相关,除非通过彼此相邻实例化。
但是,您的Bar
实例b
确实可以访问Foo
实例,即自身。通过声明Bar
是Foo
的子类,您说Bar
的每个实例也是Foo
的实例。您可以使用isinstance(b, Foo)
来测试此内容。
如果您需要从Foo
的方法访问bar
中定义的变量或方法,通常可以直接在您传递的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而不是维护遗留的Python 2应用程序,我建议学习用Python 3。)