编辑:抱歉有关父母/孩子的困惑。我是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以解析此引用?
答案 0 :(得分:1)
使用定义BaseParent
的{{1}}类,并使两个instance_id
实现继承。这将关闭您的IDE。作为附带好处,Parent
可以扩展Child
,但始终是Parent
的实例。
除此之外,这不是非常 kosher 面向对象的设计。在程序执行期间更改类层次结构属于元编程,这是一个非常强大的工具,应该很少使用。
像多重继承一样,元编程有时是解决问题的完美解决方案 - 但这需要付出代价。两者都引入了一层难以理解的复杂性,在走代码库时容易错过,之后难以维护。当读者不是实施者,或者甚至在一段时间后对同一个人来说,尤其如此。我会修改这个决定,在大多数情况下,这种方法是没有必要的。