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

2024-09-27 19:19:24 发布

您现在位置: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)的“\uem>init\ustrong>”方法的一个参数。但是,这是一种黑客行为。你知道吗

请提供问题的解决方案。你知道吗

提前谢谢。你知道吗


Tags: 实例方法storeselffooinitdefbar
2条回答

对你来说,听上去像黑客的是你应该怎么做。你知道吗

请记住,每个类可能都有大量实例,因此它无法自动知道哪个类应该与它“相关”——而使用任何魔法(例如检查父堆栈帧中是否有包含Foo实例的变量,并希望这是唯一的一个)都会非常难看,这是一个失败的理由如果我是你的老板,就狠狠地扇你一巴掌。你知道吗

因此,您应该将f作为参数传递给Bar()。你知道吗

如果您不想要一个单独的Foo实例,也就是说,您想要正常的继承,那么不需要创建Foo的实例,只需在Bar构造函数中调用Foo.__init__(self, 'Hello')super(Bar, self).__init__('Hello'),并可能接受该值作为参数而不是硬编码它。你知道吗

听起来您可能对Python中继承的工作方式感到困惑。在您展示的代码中,fb没有关系,除非它们是相邻实例化的。你知道吗

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

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

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的。有一些小问题会使它在Python2中无法正常工作。如果我建议您学习Python以外的任何其他应用程序,请参见第3章

相关问题 更多 >

    热门问题