可以说我有一个无法更改的库函数,该函数产生了类A的对象,并且我创建了一个继承自A的类B。
使用库函数生成B类对象的最直接方法是什么?
编辑-在评论中要求我提供更多详细信息,所以这里是:
PyTables是一个处理python中的分层数据集的程序包。我最常使用的功能是管理部分磁盘数据的能力。它提供了一种“数组”类型,仅随扩展切片一起提供,但我需要选择任意行。Numpy提供了此功能- 您可以通过提供长度与要选择的数组相同的布尔数组来进行选择。因此,我想对Array进行子类化以添加此新功能。
从更抽象的意义上讲,这是我之前考虑的问题。常见的解决方案是已经建议的- 为B构造一个带有A和其他参数的构造函数,然后取出A的相关位插入到B中。由于这似乎是一个非常基本的问题,我问看看是否有我不知道的标准解决方案。
由于库函数返回A,因此如果不更改它就不能使其返回B。
您可以做的一件事是编写一个函数,以获取A实例的字段并将其复制到新的B实例中:
class A: # defined by the library def __init__(self, field): self.field = field class B(A): # your fancy new class def __init__(self, field, field2): self.field = field self.field2 = field2 # B has some fancy extra stuff def b_from_a(a_instance, field2): """Given an instance of A, return a new instance of B.""" return B(a_instance.field, field2) a = A("spam") # this could be your A instance from the library b = b_from_a(a, "ham") # make a new B which has the data from a print b.field, b.field2 # prints "spam ham"
编辑:根据您的情况, 构图而不是继承 可能是一个不错的选择;那是您的B类可能只包含A的实例,而不是继承:
class B2: # doesn't have to inherit from A def __init__(self, a, field2): self._a = a # using composition instead self.field2 = field2 @property def field(self): # pass accesses to a return self._a.field # could provide setter, deleter, etc a = A("spam") b = B2(a, "ham") print b.field, b.field2 # prints "spam ham"