日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

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

發(fā)布時(shí)間:2025/4/5 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python根据一个基类生成派生类_将基类转换为派生类python(或者更像pythonic的扩展类的方式)... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

下面是如何“神奇地”用定制的子類(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。