【问题标题】:referencing class members from child class引用子类的类成员
【发布时间】:2016-10-07 15:44:43
【问题描述】:

编辑:对于父母/孩子的困惑,我们深表歉意。我是 OOP 的新手,所以我的术语很混乱。

我想了解引用将由继承的(子类)提供的类属性的适当策略。

我有一个案例,我有一个将使用的公共基类,以及子类可以继承的多个父类。每个子类将具有相同的方法集,但实现不同。我遇到的问题是我需要子类来引用父类的类属性。下面的代码似乎工作正常,但我的 IDE (pycharm) 抱怨未解析的属性引用,所以我想知道这是否是反模式。

模块parent1.py

class Parent(object):
    def __init__(self):
       pass
    def do_something(self):
       result = self.instance_id

模块parent2.py

class Parent(object):
    def __init__(self):
        pass
    def do_something(self):
        result = self.instance_id+1

模块child.py

if CONSTANT:
    from parent1 import Parent
else:
    from parent2 import Parent

class Child(Parent):
    def __init__(self, instance_id):
         self.instance_id = instance_id
         Parent.__init__(self)

在这种情况下,即使代码有效,pycharm IDE 也会将 Parent1 和 Parent2 中对 self.instance_id 的引用标记为“未解析的属性引用”。我考虑过将它移到每个父类中,但是关于 instance_id 的任何内容都不需要在 Parent 类中更改,因此为每个 Parent 定义一次感觉是多余的。所以我的问题如下: 1、这个代码组织有什么问题吗? 2.如果没有问题,我该如何修复IDE来解决这个引用?

【问题讨论】:

  • 我从来没有听说过父母从孩子那里继承。
  • 你应该为你试图表示的任何结构选择不太容易混淆的名称。子类从父类继承。
  • Child2 的目的是什么?它从未在您的代码中的任何地方引用。
  • 另外,您能否举例说明如何使用这些类,以及产生“未解析属性”错误的示例?
  • 已编辑以阐明示例并修复父/子命名问题。

标签: python class python-3.x


【解决方案1】:

使用定义instance_idBaseParent 类,并让两个Parent 实现都继承自它。这将关闭您的 IDE。作为附带的好处,Child 可以扩展Parent,但始终是BaseParent 的一个实例。

除此之外,这不是非常kosher 面向对象的设计。在程序执行期间更改类层次结构属于元编程,这是一个非常强大的工具,应该很少使用。

元编程,就像多重继承一样,有时是解决问题的完美解决方案——但它是有代价的。两者都引入了一层难以理解的复杂性,在遍历代码库时很容易错过,之后也很难维护。

当读者不是实施者时尤其如此,或者一段时间后甚至不是同一个人。我会修改决定,在大多数情况下,这种方法是没有必要的。

【讨论】:

  • 感谢您的反馈,这真的很有帮助。我要解决的问题是,我希望上层代码能够在更改一些底层实现时引用相同的类名(在此示例中为 Child)。具体用例是该代码将提供硬件接口,但我们希望能够插入所述硬件的软件模拟。因此可以编写上层脚本,而无需关心它们是与真实硬件还是软件模拟对话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多