0

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

例如。

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 _ ”方法的参数。但是,这是一种黑客行为。

请提供问题的解决方案。

提前致谢。

4

2 回答 2

2

对你来说听起来像是 hack 的是你应该怎么做。

请记住,每个类可能有大量实例,因此它无法自动知道哪个应该与它“相关” - 并使用任何类型的魔法(例如检查父堆栈帧中是否有一个变量包含Foo和希望这是唯一的)如果我是你的老板,那将是非常丑陋的,并且有理由狠狠地打你一巴掌。

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

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

于 2012-10-15T12:09:12.103 回答
2

听起来您可能对继承在 Python 中的工作方式感到困惑。在您显示的代码中,除了被彼此相邻实例化之外,它们并不相关fb

但是,您的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 2 应用程序以外的任何原因学习 Python,我建议使用 Python 3 学习.)

于 2012-10-15T13:02:14.663 回答