Бросьте базовый класс к Python производного класса (или больше pythonic способа расширить классы)

Я должен расширить пакет Python Networkx и добавить несколько методов к Graph класс для моей конкретной потребности

Путем я думал о выполнении, это - simplying, который говорит получение нового класса NewGraph, и добавление требуемых методов.

Однако существует несколько других функций в networkx, которые создают и возвращаются Graph объекты (например, генерируют случайный график). Я теперь должен повернуть их Graph объекты в NewGraph объекты так, чтобы я мог использовать свои новые методы.

Каков лучший способ сделать это? Или я должен заниматься проблемой совершенно другим способом?

37
задан zenna 12 August 2010 в 01:20
поделиться

2 ответа

Если вы просто добавляете поведение и не зависите от дополнительных значений экземпляра, вы можете назначить объекту __ 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), это может помочь решить вашу проблему.

51
ответ дан 27 November 2019 в 04:45
поделиться

Если функция создает объекты 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):
        ....
0
ответ дан 27 November 2019 в 04:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: