python根据一个基类生成派生类_将基类转换为派生类python(或者更像pythonic的扩展类的方式)...

下面是如何“神奇地”用定制的子类替换模块中的类,而不接触模块。它只是普通子类化过程中的几行额外代码,因此给了您(几乎)所有子类化的能力和灵活性。例如,如果您愿意,这允许您添加新属性。import networkx as nx

class NewGraph(nx.Graph):

def __getattribute__(self, attr):

"This is just to show off, not needed"

print "getattribute %s" % (attr,)

return nx.Graph.__getattribute__(self, attr)

def __setattr__(self, attr, value):

"More showing off."

print " setattr %s = %r" % (attr, value)

return nx.Graph.__setattr__(self, attr, value)

def plot(self):

"A convenience method"

import matplotlib.pyplot as plt

nx.draw(self)

plt.show()

到目前为止,这和普通的子类完全一样。现在我们需要将这个子类挂接到networkx模块中,以便nx.Graph的所有实例化都会产生NewGraph对象。下面是用nx.Graph()实例化nx.Graph对象时通常发生的情况1. nx.Graph.__new__(nx.Graph) is called

2. If the returned object is a subclass of nx.Graph,

__init__ is called on the object

3. The object is returned as the instance

我们将替换nx.Graph.__new__,并使其返回NewGraph。在它中,我们调用object的__new__方法,而不是NewGraph的__new__方法,因为后者只是调用我们要替换的方法的另一种方法,因此将导致无休止的递归。def __new__(cls):

if cls == nx.Graph:

return object.__new__(NewGraph)

return object.__new__(cls)

# We substitute the __new__ method of the nx.Graph class

# with our own.

nx.Graph.__new__ = staticmethod(__new__)

# Test if it works

graph = nx.generators.random_graphs.fast_gnp_random_graph(7, 0.6)

graph.plot()

在大多数情况下,这是你需要知道的,但有一个问题。重写__new__方法只影响nx.Graph,而不影响其子类。例如,如果调用nx.gn_graph,它将返回nx.DiGraph的一个实例,那么它将没有我们喜欢的扩展。您需要对要使用的nx.Graph的每个子类进行子类划分,并添加所需的方法和属性。使用mix-ins可能更容易在遵循DRY原则的同时一致地扩展子类。

尽管这个例子看起来很简单,但是这种连接到模块中的方法很难以涵盖可能出现的所有小问题的方式进行概括。我相信根据手头的问题来调整它会更容易。例如,如果要挂接的类定义了自己的自定义__new__方法,则需要在替换它之前存储它,并调用此方法而不是object.__new__。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值