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__。
總結
以上是生活随笔為你收集整理的python根据一个基类生成派生类_将基类转换为派生类python(或者更像pythonic的扩展类的方式)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 期货入金流程
- 下一篇: 中空字符串有什么用_中空玻璃中还要充氩气