一尘不染

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

python

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

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

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

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


阅读 113

收藏
2021-01-20

共1个答案

一尘不染

如果您只是添加行为,而不依赖于其他实例值,则可以分配给该对象的__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中进行强制转换一样,在不考虑此事的情况下也不应该这样做。我已经发布了一个相当有限的示例,但是如果您可以保持约束(仅添加行为,没有新的实例变量),那么这可能有助于解决您的问题。

2021-01-20