【问题标题】:Defining a class within another class and calling a parent method在另一个类中定义一个类并调用父方法
【发布时间】:2012-01-16 10:02:11
【问题描述】:

我有 c 类定义和该类的一些内部类定义:

class DoXJob():
    def __init__(self, param1, param2):
        <choose an inner class to use> 

    def DoIt(self):
        pass

    def Finalize(self):
        <do finalization>

    class DoXInSomeWay():
        def __init__(self):
            ....
            ....
        def DoIt(self):
            ...

    class DoXInSomeOtherWay():
        def __init__(self):
            ....
            ....
        def DoIt(self):
            ...

逻辑很简单,我有一些内部类定义来处理工作,我用一些参数调用DoXJob,然后它决定使用哪个内部类,并用选定的内部方法覆盖DoXJob.DoIt方法类方法(DoXInSomeOtherWay.DoItDoXInWay.DoIt

obj = DoXJob(param1, param2)
obj.DoIt()

一切都很好,我想要的是从ineer 类中触发DoXJob.Finalize,比如从DoXInSomeOtherWay.DoItDoXInWay.DoIt 调用它。但我不知道如何处理这个问题,以及它是否正确。还是像DoXJob这样的方法调用更好:

obj = DoXJob(param1, param2)
obj.DoIt()
obj.Finalize()

【问题讨论】:

  • 你为什么不删除内部,创建子类并重写你想要改变的方法?
  • 或者,您可以对您似乎正在尝试做的事情采取更传统的方法,即策略模式。
  • @DonCallisto 没有太多东西需要使用子类化和继承。此外,内部类只会在基类中使用,所以遵循这种模式而不是子类化对我来说似乎更合乎逻辑。
  • 直接从内部类调用DoXJob.Finalize()
  • @martineau:有什么例子?

标签: python class inner-classes


【解决方案1】:

不幸的是,python 似乎没有办法引用封闭的实例。

相反,在您选择使用哪个内部类并可能对其进行实例化的外部__init__ 中,您需要将外部对象的self 作为参数传递给内部类实例。

编辑:选择重新设计的主题 - 如果您可以简单地调用DoIt 方法,然后等待它的返回,那么您可以在同一个地方(即调用者)调用Finalize,因此避免内部调用外部的需要。

【讨论】:

  • 无法调用上层实例对于这种有用的语言来说是一个很好的选择。我的方法就像您在编辑中提供的那样,我猜...我将丢弃方法覆盖并将内部类实例设置为上层类变量并从上层DoIt 方法进行DoIt 调用。那将是一个更清洁的解决方案...
  • @FallenAngel:我实际上认为这在某些方面是件好事。更烦人的是,在封闭类范围内定义的名称不在内部类范围内(并且引用外部类对象上的那些名称,而不是任何给定的实例)。
  • 这就是我的意思...我只想访问一些封闭的类变量...但由于这是不可能的,我要么必须将变量传递给内部类ìnit`作为参数或通过将内部类实例设置为某个封装类变量,然后在调用任何内部类函数之前定义内部类变量...
猜你喜欢
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 2019-05-22
  • 2013-11-02
相关资源
最近更新 更多