如何扩展类方法

时间:2014-08-23 04:27:35

标签: python

SubClassASubClassB都是Base类的子类(都来自同一个Base类)。由于getInfo()方法在Base()类中声明,因此它(此方法)在A和B子类之间共享。调用getInfo()方法时,它返回self.attr变量的值(在A和B子类之间共享)。现在我想“扩展”这个方法。因此,除了 instanceA.getInfo()使用self.attr 通过subClassA实例调用它之外,它还会返回self.attrA。同样,如果使用instanceB:除了返回instanceB.getInfo()之外,还会返回self.attrB self.attrBase()类的方法getInfo()如何扩展,以便为子类A和B“自定义”?

class Base(object):
    def __init__(self):
        super(Base, self).__init__()
        self.attr='Attr'

    def getInfo(self):
        info=self.getAttr()
        return info
    def getAttr(self):
        return self.attr

class SubClassA(Base):
    def __init__(self):
        super(SubClassA, self).__init__()  
        self.attrA='attrA'      
    def getAttrA(self):
        return self.attrA

class SubClassB(Base):
    def __init__(self):
        super(SubClassB, self).__init__()  
        self.attrB='attrB'      
    def getAttrB(self):
        return self.attrB

instanceA=SubClassA()
instanceB=SubClassB()
print instanceA.getInfo()
print instanceB.getInfo()

1 个答案:

答案 0 :(得分:10)

只需在子类中定义getInfo方法即可。如果需要,使用super(就像在构造函数中一样)来获取基类getInfo()的结果并根据需要合并它。

详细说明:当给定某个类c的实例C并要求查找属性c.attr时,Python会在一系列地方查找该属性。特别是,它将在基类之前查找派生类。因此以下代码

class Base(object):
    def method(self):
        return "I'm a base object!"

class Derived(Base):
    def method(self):
        return "I'm a derived object!"

obj = Derived()
print obj.method()

将打印“我是派生对象!”,因为Python在method中查找Derived,找到它,并且永远不会检入Base

您提到需要在Base.method对象中调用Derived。这就是super进来的地方。super(Derived, self).method()会在Base.method上找到并致电self。您已经在构造函数中执行此操作。

例如:

class Computer(object):
    def boot_message(self):
        return 'I am a computer'

class AppleComputer(Computer):
    def boot_message(self):
        return super(AppleComputer, self).boot_message() + ' with a really shiny logo'

我们避免重复Computer.boot_message中的工作,取得结果并根据需要进行修改。

请注意,super(Base, self).__init__()行不是必需的;一般情况下,只有在基类__init__()能够在没有代码重复的情况下完成派生类__init__()的情况下才能进行此类调用,而object不是这种情况。