关于继承:如何从Python的派生类中获取父类实例的名称?

How to get the name of the instance of the parent class from the derived class in Python?

嗨,我想从继承的子类中获取基类的实例名。

为Ex.

1
2
3
4
5
6
7
8
9
10
11
12
13
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",这样如果我将类栏实例化为b,它还应该存储父类的哪个实例正在调用派生类实例。

一种方法是将父类(foo)实例"f"解析为类(bar)的"_init_uuu"方法的参数,但这有点像黑客。

请提供问题的解决方案。

事先谢谢。


听起来您可能对继承在Python中的工作方式感到困惑。在您所显示的代码中,fb不相关,除非是相邻实例化。

但是,您的Bar实例b确实可以访问Foo实例,即它本身。通过声明BarFoo的一个子类,你是说Bar的每一个实例也是Foo的一个实例。你可以用isinstance(b, Foo)测试这个。

如果您需要从Bar的方法访问Foo中定义的变量或方法,通常您只需直接在所传递的self值上访问它。或者,如果您正在重写Bar中的方法(即,定义一个与Foo中已存在的方法同名的方法),则可以使用super

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

(注意上面的代码是针对Python3的。在python 2中有一些小东西会使它不能正常工作。如果您学习python的原因不是维护传统的python 2应用程序,那么我建议您学习python 3。)


听起来像是一个黑客,你应该怎么做。

记住,每个类可能有大量的实例,因此它无法自动知道哪个实例应该与它"相关"——并且使用任何类型的魔法(例如,检查父堆栈帧中是否有保存Foo实例的变量,并希望这是唯一的一个)将是非常难看的,并且有理由狠狠地扇你一耳光。如果我是你的老板那张脸。

所以,你应该把f作为论点传给Bar()

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