2011-04-19 56 views
1

我有一个基类,Python中得出几个:问题有关Python和类

class Base: 
    def Foo(self): 
     pass 

# First derived class 
class Der1(Base): 
    def OwnFoo(self): 
     # Do something 1 
    def OwnFoo2(self): 
     # Do something 2 

    def Foo(self): 
     # Do something 3 

# Second derived class 
class Der2(Base): 
    def OwnFoo(self): 
     # Do something 1 
    def OwnFoo2(self): 
     # Do something 2 

    def Foo(self): 
     # Do something 3 

的问题是:

我在Der1一些预定义的代码。从Der2几乎所有的功能都一样。我怎样才能用更少的代码编写这个?

我无法将该代码添加到父级。不应该触摸父类。

例如,Der2.OwnFoo不一样Der1.OwnFoo,也许有一些建筑在Python只是从第一级呼叫OwnFoo,而不是写一遍代码?


我无法改变的Der1Der2父!它应该是Base

+0

它是一门功课? – eumiro 2011-04-19 13:25:35

回答

3

既然你可以不改变继承结构,创建一个包含通用代码的帮助类,并通过composition而不是继承来包含它。

# Common code goes in this new class 
class DerHelper: 
    def __init__(self, parent): 
     self._parent = parent 
    def OwnFoo(self): 
     print 'Do something 1', self._parent 
    def OwnFoo2(self): 
     print 'Do something 2', self._parent 
    def Foo(self): 
     print 'Do something 3', self._parent 

# First derived class 
class Der1(Base): 
    def __init__(self): 
     # include helper class by composition 
     self._helper = DerHelper('Der1') 
    def OwnFoo(self): 
     self._helper.OwnFoo() 
    def OwnFoo2(self): 
     self._helper.OwnFoo2() 
    def Foo(self): 
     self._helper.Foo() 

# Second derived class 
class Der2(Base): 
    def __init__(self): 
     # include helper class by composition 
     self._helper = DerHelper('Der2') 
    def OwnFoo(self): 
     self._helper.OwnFoo() 
    def OwnFoo2(self): 
     self._helper.OwnFoo2() 
    def Foo(self): 
     self._helper.Foo() 

当然,您可以将引用传递给父代而不是字符串。我只是这样做了演示目的。

用法:

d = Der1() 
d.OwnFoo() 
d.OwnFoo2() 
d.Foo() 

d = Der2() 
d.OwnFoo() 
d.OwnFoo2() 
d.Foo() 

输出:

Do something 1 Der1 
Do something 2 Der1 
Do something 3 Der1 
Do something 1 Der2 
Do something 2 Der2 
Do something 3 Der2 
+0

令人敬畏的例子! – jathanism 2011-04-19 14:01:59

0

如何制作Der2的子类Der1

+0

无法更改父级。 – Ockonal 2011-04-19 13:24:26

2

使Der2成为Der1的一个子类,就完成了。

class Base: 
    def Foo(self): 
     pass 

# First derived class 
class Der1(Base): 
    def OwnFoo(self): 
     # Do something 1 
    def OwnFoo2(self): 
     # Do something 2 

    def Foo(self): 
     # Do something 3 

# Second derived class (subclasses Der1) 
class Der2(Der1): 
    pass 

Der2的任何行为,你想专注可以在类定义中添加。如果在Der2(例如Der2.OwnFoo())中创建了一个名称相同的新方法,那么它将重载从Der1继承的默认方法。

编辑:如果你不能改变父母,把你想要继承的所有行为放在基类中,记住你可以重载或定制子类中的任何方法。

在代码:

# Base class 
class Base: 
    def Foo1(self): 
     # Do something 1 
    def Foo2(self): 
     # Do something 2 
    def Foo(self): 
     # Do something 3 

# First derived class, inherits everything from Base 
class Der1(Base): 
    pass 

# Second derived class 
class Der2(Base): 
    pass 

有一个“绝招”,你可以做调用从父继承了原有方法,获取返回的值,然后自定义的行为。这只有在方法实际返回一个值时才会起作用,并且如果该方法操作类中的属性,那么该方法可能会很危险,除非这是您想要的和期望的。

在代码:

# Second derived class, with customized methods 
class Der2(Base): 
    # Anything that is not explicitly define is inherited from parent 
    # as-is. 

    def Foo(self): 
     # My Foo() overloads Base.Foo() inherited from parent class. 
     # Do something "special" 3 

    def Foo1(self): 
     # Calls parent Base.Foo1() and then manipulates return data. 
     base_output = Base.Foo1(self) 
     # Do something "special" 1 with 'base_output' 
+0

看看更新。 – Ockonal 2011-04-19 13:24:09

1

这是一门功课?

看的Der2第一行:

class Der2(Base): 

什么说什么是它的父(例如它下降和herits方法和属性从一个类)?你怎么能改变这个?

1

如果Der1Der2共享很多代码,那么你应该把它放在一个超类;因为Base不能触及,在之间引入一类:

class Der(Base): 
    def OwnFoo(self): 
     ... 

class Der1(Der): 
    ... 

class Der2(Der): 
    ... 

(根据您的类层次结构中,“派生Der2Der1”选项,其他人建议也可能是有效的。)