2016-10-20 143 views
1

我仍然在试图总结我的周围Python类继承头如此忍受我的类:如果我有两个非常相似的类:抽象与继承

class Red: 
    def print_color(self): 
     print('red') 

class Blue: 
    def print_color(self): 
     print('blue') 

什么是继承这些类的正确方法创建一个抽象类(比如Color),该抽象类使用某种参数来初始化,这个参数确定使用哪个基础类?初始化之后,我应该能够做到这一点:

>>> a = Color('red') 
>>> a.print_color() 
red 
+2

这似乎不是继承。 –

+0

@DanielRoseman对不起,如果你建议更好的措辞,我可以编辑这个问题。 – mart1n

回答

4

为了让这个期望的工作,比如严格按照原样,这是所有你需要:

class Color: 
    def __init__(self, color): 
     self.color = color 

    def print_color(self): 
     print(self.color) 

无继承,什么都没有。

如果你真的想Color('red')导致的实例的类Red,然后Color只是需要一个工厂函数:

def Color(color): 
    constructors = {'red': Red, 'blue': Blue} 
    return constructors[color]() 

还在这里不涉及继承。

1

所以有很多可能的答案,但我认为一个非常好的一个被称为工厂设计模式。它覆盖了很多不同的地方,但这里看起来不错。

http://python-3-patterns-idioms-test.readthedocs.io/en/latest/Factory.html

+0

哈,完美!这正是我所期待的。并感谢您的宝贵资源! – mart1n

+1

请将相关信息直接放入您的答案中,以避免仅链接回答。链接很好,作为更多的资源。 – chepner

+0

@ mart1n谢谢你,如果能帮到你,我会很感激你的回复或接受我的回答。谢谢。 – bravosierra99

0

当您有需要在所有继承对象之间共享的方法时,继承是有意义的。你的例子可能是在这种情况下:

class color(object): 
    def __str__(self): 
     return self.name 

所以当我继承了我能:

class red(color): 
    def __init__(self): 
     self.name = 'red' 

任何时候我打印或颜色转换为字符串我会得到我初始化的名称(”红色“)。

如果你来自常见的静态(编译)语言,我想在这里注意一个重要的事情。 __init__是不一样的一个普通的构造函数(是不是真的一个呢?),所以如果我的色彩中定义:

class color(object): 
    def __init__(self): 
     print 'Init color!' 
    def __str__(self): 
     return self.name 

这不会得到自动制作的“红色”对象在打印时,除非你明确调用基本初始化(如果感兴趣,可以使用color.__init__(self))。

这一点使我重新定义了继承的方法(__init__在我的最后一个例子中)。 Python使用覆盖在这种情况下,因此由(最小的)的孩子中定义的方法被调用,除非到基本方法的显式调用时,ALA:

base.some_method(child_object,...) 

就像使用`__init__`。这有点显示了所有python对象的多态性质。

这些都是基础知识,只是尝试和开始一些课程。