SubClassA
和SubClassB
都是Base
类的子类(都来自同一个Base
类)。由于getInfo()
方法在Base()
类中声明,因此它(此方法)在A和B子类之间共享。调用getInfo()
方法时,它返回self.attr
变量的值(在A和B子类之间共享)。现在我想“扩展”这个方法。因此,除了 instanceA.getInfo()
使用self.attr
通过subClassA实例调用它之外,它还会返回self.attrA
。同样,如果使用instanceB:除了返回instanceB.getInfo()
之外,还会返回self.attrB
self.attr
。 Base()
类的方法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()
答案 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
不是这种情况。