如何从Python的派生类中获取父类实例的名称?

时间:2012-10-15 12:02:35

标签: python inheritance instance

您好我想从继承的子类中获取基类的实例名称。

代表

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)但是,这是一种黑客攻击。

请提供问题的解决方案。

提前致谢。

2 个答案:

答案 0 :(得分:2)

听起来像是黑客攻击你应该怎么做。

请记住,每个类可能有大量实例,因此不能自动知道哪个应该与之“相关” - 并使用任何种类的魔法(例如检查父级)如果我是你的老板,那么持有一个Foo实例的变量的堆栈框架并希望这是唯一的一个)会非常难看,并且有理由对你施以压力。

因此,您f作为参数传递给Bar()

如果您不想要单独的Foo实例 - 即您想要正常继承 - 则无需创建Foo的实例,只需调用Foo.__init__(self, 'Hello')或{{1}在super(Bar, self).__init__('Hello')构造函数中,可能接受该值作为参数而不是硬编码。

答案 1 :(得分:2)

听起来你可能会对Python中的继承如何工作感到困惑。在您显示的代码中,fb不相关,除非通过彼此相邻实例化。

但是,您的Bar实例b确实可以访问Foo实例,即自身。通过声明BarFoo的子类,您说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。)