[英]How to extend class method
SubClassA
和SubClassB
都是Base
class 的子类(都继承自同一个Base
类)。 由于getInfo()
方法是在Base()
class 中声明的,因此它(此方法)在 A 和 B 子类之间共享。 当getInfo()
方法时,它返回self.attr
变量的值(在 A 和 B 子类之间共享)。 现在我想“扩展”这个方法。 因此,当除了self.attr
之外还使用instanceA.getInfo()
通过 subClassA 实例调用它时,它也会返回self.attrA
。 同样,如果使用 instanceB:除了返回self.attr
之外,还返回instanceB.getInfo()
self.attrB
。 如何扩展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()
只需在子类中定义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在Derived
中查找method
,找到它,并且从不在Base
检查。
您提到需要在Derived
对象中调用Base.method
。 这就是super
进来的地方。 super(Derived, self).method()
会在self
Base.method
找到并调用Base.method
。 您已经在构造函数中执行此操作。
例如:
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
不是这种情况。
另一个选项是您可以返回两个属性:
return self.attr, self.attrA
此外,除了 .nethreeseven 之外,另一种方法是您可以使用 attrA 数据扩展 attr 数据本身,例如在列表中或添加到字符串中,然后返回它。
或者您可以递归地或使用装饰器调用您拥有的两种方法,这可能如下所示。 直接访问(并重新定义)class 的定义
您可以获得带有func属性的原始 function:
ClassName.function_name = decorator(ClassName.function_name.__func__)
。
来自如何在 python 中“事后”将装饰器附加到 function? (Martijn Pieters 在功能/装饰器领域回答问题)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.