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

可以说我有一个无法更改的库函数,该函数产生了类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"

以上是 将对象转换为Python中的子类? 的全部内容, 来源链接: utcz.com/qa/397807.html

回到顶部