引用子类

时间:2016-10-07 15:44:43

标签: python class python-3.x

编辑:抱歉有关父母/孩子的困惑。我是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的引用标记为“未解析的属性引用”。我想过将它移到每个父类中,但是在parent类中没有关于instance_id的更改,因此为每个Parent定义一次会感觉多余。所以我的问题如下: 1.这个代码组织有什么问题吗? 2.如果它没有任何问题,我如何修复IDE以解析此引用?

1 个答案:

答案 0 :(得分:1)

使用定义BaseParent的{​​{1}}类,并使两个instance_id实现继承。这将关闭您的IDE。作为附带好处,Parent可以扩展Child,但始终是Parent的实例。

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

像多重继承一样,元编程有时是解决问题的完美解决方案 - 但这需要付出代价。两者都引入了一层难以理解的复杂性,在走代码库时容易错过,之后难以维护。

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