【发布时间】:2011-08-04 13:31:50
【问题描述】:
我正在 Python 中创建一个类 (class0),它当前基于一个类 (class1);但是,我也想从另一个类(class2)继承。关于 class2 的事情是我不想要它的所有方法和属性,我只需要一个方法。 class0 是否可以仅从 class2 继承单个方法?
【问题讨论】:
标签: python class inheritance
我正在 Python 中创建一个类 (class0),它当前基于一个类 (class1);但是,我也想从另一个类(class2)继承。关于 class2 的事情是我不想要它的所有方法和属性,我只需要一个方法。 class0 是否可以仅从 class2 继承单个方法?
【问题讨论】:
标签: python class inheritance
在这种情况下,让另一个类实现您想要的方法的“mixin”方法是正确的做法。 但是为了完整起见,因为它准确地回答了您的要求,所以我补充说,是的,可以有一种行为,就像您想要的“部分继承”一样(但请注意,这样的概念并不正式存在)。
只需在新类上添加成员,这些成员引用您希望在其中重复的方法或属性:
class Class2(object):
def method(self):
print ("I am method at %s" % self.__class__)
class Class1(object):
pass
class Class0(Class1):
method = Class2.__dict__["method"]
ob = Class0()
ob.method()
请注意,在 Python 2.x(最高 2.7)中需要从 __dict__ 类中检索方法 - 因为为了在方法中转换函数而进行了运行时转换。在 Python 3.0 及以上版本中,只需更改行
method = Class2.__dict__["method"]
到
method = Class2.method
【讨论】:
一种方法是使用“混合”方法:
class Mixin(object):
def method(self):
pass
class C1(Mixin, ...parents...):
pass
class C2(Mixin, ...parents...):
pass
另一种方式是组合:
class C1(object):
def method(self):
pass
class C2(object):
def __init__(self):
self.c1 = C1()
def method(self):
return self.c1.method()
【讨论】:
method 方法隐藏在任何其他父级中。
你为什么不使用合成呢?让您的班级保留对所需对象的引用,并委托给它。
【讨论】:
创建另一个实现这个方法的基类,并使class2和class1都继承这个类
【讨论】: