python根据一个基类生成派生类_将基类转换为派生类python(或者更像pythonic的扩展类的方式)...
下面是如何“神奇地”用定制的子類(lèi)替換模塊中的類(lèi),而不接觸模塊。它只是普通子類(lèi)化過(guò)程中的幾行額外代碼,因此給了您(幾乎)所有子類(lèi)化的能力和靈活性。例如,如果您愿意,這允許您添加新屬性。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()
到目前為止,這和普通的子類(lèi)完全一樣。現(xiàn)在我們需要將這個(gè)子類(lèi)掛接到networkx模塊中,以便nx.Graph的所有實(shí)例化都會(huì)產(chǎn)生NewGraph對(duì)象。下面是用nx.Graph()實(shí)例化nx.Graph對(duì)象時(shí)通常發(fā)生的情況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。在它中,我們調(diào)用object的__new__方法,而不是NewGraph的__new__方法,因?yàn)楹笳咧皇钦{(diào)用我們要替換的方法的另一種方法,因此將導(dǎo)致無(wú)休止的遞歸。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()
在大多數(shù)情況下,這是你需要知道的,但有一個(gè)問(wèn)題。重寫(xiě)__new__方法只影響nx.Graph,而不影響其子類(lèi)。例如,如果調(diào)用nx.gn_graph,它將返回nx.DiGraph的一個(gè)實(shí)例,那么它將沒(méi)有我們喜歡的擴(kuò)展。您需要對(duì)要使用的nx.Graph的每個(gè)子類(lèi)進(jìn)行子類(lèi)劃分,并添加所需的方法和屬性。使用mix-ins可能更容易在遵循DRY原則的同時(shí)一致地?cái)U(kuò)展子類(lèi)。
盡管這個(gè)例子看起來(lái)很簡(jiǎn)單,但是這種連接到模塊中的方法很難以涵蓋可能出現(xiàn)的所有小問(wèn)題的方式進(jìn)行概括。我相信根據(jù)手頭的問(wèn)題來(lái)調(diào)整它會(huì)更容易。例如,如果要掛接的類(lèi)定義了自己的自定義__new__方法,則需要在替換它之前存儲(chǔ)它,并調(diào)用此方法而不是object.__new__。
總結(jié)
以上是生活随笔為你收集整理的python根据一个基类生成派生类_将基类转换为派生类python(或者更像pythonic的扩展类的方式)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 期货入金流程
- 下一篇: 中空字符串有什么用_中空玻璃中还要充氩气