Я должен расширить пакет Python Networkx и добавить несколько методов к Graph
класс для моей конкретной потребности
Путем я думал о выполнении, это - simplying, который говорит получение нового класса NewGraph
, и добавление требуемых методов.
Однако существует несколько других функций в networkx, которые создают и возвращаются Graph
объекты (например, генерируют случайный график). Я теперь должен повернуть их Graph
объекты в NewGraph
объекты так, чтобы я мог использовать свои новые методы.
Каков лучший способ сделать это? Или я должен заниматься проблемой совершенно другим способом?
Если вы просто добавляете поведение и не зависите от дополнительных значений экземпляра, вы можете назначить объекту __ 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, его нельзя делать, не задумываясь над этим вопросом. Я опубликовал довольно ограниченный пример, но если вы можете остаться в рамках ограничений (просто добавить поведение, никаких новых экземпляров vars), это может помочь решить вашу проблему.
Если функция создает объекты Graph, вы не можете превратить их в объекты NewGraph.
Другой вариант для NewGraph - иметь Graph, а не быть Graph. Вы делегируете методы Graph имеющемуся у вас объекту Graph и можете обернуть любой объект Graph в новый объект NewGraph:
class NewGraph:
def __init__(self, graph):
self.graph = graph
def some_graph_method(self, *args, **kwargs):
return self.graph.some_graph_method(*args, **kwargs)
#.. do this for the other Graph methods you need
def my_newgraph_method(self):
....