小编典典

将对象转换为Python中的子类?

python

可以说我有一个无法更改的库函数,该函数产生了类A的对象,并且我创建了一个继承自A的类B。

使用库函数生成B类对象的最直接方法是什么?

编辑-在评论中要求我提供更多详细信息,所以这里是:

PyTables是一个处理python中的分层数据集的程序包。我最常使用的功能是管理部分磁盘数据的能力。它提供了一种“数组”类型,仅随扩展切片一起提供,但我需要选择任意行。Numpy提供了此功能-
您可以通过提供长度与要选择的数组相同的布尔数组来进行选择。因此,我想对Array进行子类化以添加此新功能。

从更抽象的意义上讲,这是我之前考虑的问题。常见的解决方案是已经建议的-
为B构造一个带有A和其他参数的构造函数,然后取出A的相关位插入到B中。由于这似乎是一个非常基本的问题,我问看看是否有我不知道的标准解决方案。


阅读 376

收藏
2021-01-20

共1个答案

小编典典

由于库函数返回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"
2021-01-20