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

发布于 2021-01-29 15:06:55

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

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

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

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

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

关注者
0
被浏览
75
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看