将对象转换为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