将基类转换为派生类python(或更扩展类的pythonic方式)

发布于 2021-01-29 14:55:32

我需要扩展Networkx python包,并Graph为我的特殊需求向类添加一些方法

我想到的方法是简单地派生一个新的类say NewGraph,并添加所需的方法。

但是,networkx中还有其他几个函数可以创建和返回Graph对象(例如,生成随机图)。现在,我需要将这些Graph对象转换为NewGraph对象,以便可以使用新方法。

最好的方法是什么?还是我应该以完全不同的方式解决问题?

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

    如果您只是添加行为,而不依赖于其他实例值,则可以分配给该对象的__class__

    from math import pi
    
    class Circle(object):
        def __init__(self, radius):
            self.radius = radius
    
        def area(self):
            return pi * self.radius**2
    
    class CirclePlus(Circle):
        def diameter(self):
            return self.radius*2
    
        def circumference(self):
            return self.radius*2*pi
    
    c = Circle(10)
    print c.radius
    print c.area()
    print repr(c)
    
    c.__class__ = CirclePlus
    print c.diameter()
    print c.circumference()
    print repr(c)
    

    印刷品:

    10
    314.159265359
    <__main__.Circle object at 0x00A0E270>
    20
    62.8318530718
    <__main__.CirclePlus object at 0x00A0E270>
    

    这与在Python中获得的“转换”非常接近,并且与在C中进行强制转换一样,在不考虑此事的情况下也不应该这样做。我已经发布了一个相当有限的示例,但是如果您可以保持约束(仅添加行为,没有新的实例变量),那么这可能有助于解决您的问题。



知识点
面圈网VIP题库

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

去下载看看