繁体   English   中英

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

[英]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中的工作方式感到困惑。 在您显示的代码中, fb没有关系,只是彼此相邻实例化了。

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM