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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python类的应用_Python · 元类(Meta Class)及其应用

發(fā)布時(shí)間:2025/3/15 python 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python类的应用_Python · 元类(Meta Class)及其应用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

(這里是本章用到的 GitHub 地址)萬物皆對象 —— Python

本章所介紹的元類(Meta Class)和之前介紹過的裝飾器(Decorator)都是上面這句話的具現(xiàn),其中裝飾器告訴過我們“函數(shù)亦對象”,元類則會(huì)告訴我們“類亦對象”

Meta Class 是傳說中的黑魔法、黑魔法中的戰(zhàn)斗機(jī)(……)。我其實(shí)對它也只一知半解,所以以下說的內(nèi)容可能僅展現(xiàn)了它神奇功用的冰山一角。不過作為一個(gè)入門教程來說的話、可能會(huì)剛剛好也說不定(其實(shí)只是在為自己的弱小找借口)(喂)

所謂的“類亦對象”和“函數(shù)亦對象”的思想類似:它意味著類可以被賦值給變量、通過變量也能創(chuàng)建該類的實(shí)例。舉個(gè)栗子:

class Class:

def __init__(self):

self.x = 1

one = Class

print(one().x)

Out[1]:

1

正如裝飾器返回的是一個(gè)函數(shù),我們可以認(rèn)為元類返回的是一個(gè)類。 也正如我在講裝飾器里說過的,裝飾器的核心思想,就是裝飾函數(shù)這個(gè)對象、讓函數(shù)自身代碼不變的情況下、增添一些具有普適性的功能。在我看來,元類的核心思想,就是搗鼓類這個(gè)對象、使你能對其有著最高程度的控制權(quán)。

注意:這絕不一定是個(gè)準(zhǔn)確的理解!正如 Python界的領(lǐng)袖 Tim Peters 說過:元類就是深度的魔法,99%的用戶應(yīng)該根本不必為此操心。如果你想搞清楚究竟是否需要用到元類,那么你就不需要它。那些實(shí)際用到元類的人都非常清楚地知道他們需要做什么,而且根本不需要解釋為什么要用元類。

我的理解僅僅來自于我對元類的應(yīng)用,它很有可能是非常片面的。不過,由于我的目的是為了讓大家知道元類的一種可能是最簡單的使用姿勢、使大家不至于看到代碼里面的 metaclass 就怕,所以還請觀眾老爺們允許我這個(gè)半吊子繼續(xù)用這個(gè)理解講下去(如果有觀眾老爺有更深更好的理解、歡迎在評論區(qū)里面教我、我會(huì)把它們貼在這里的 ( σ'ω')σ)

那么什么叫做最高程度的控制權(quán)呢?一個(gè)比較簡單的栗子就是實(shí)現(xiàn)如下需求:定義一個(gè)“人”(Person)類,它有三個(gè)方法:吃飯、睡覺、續(xù)幾秒(咦)

定義 Person 的三個(gè)子類“小張”(Zhang)、“小王”(Wang)、“小江”(Jiang)

定義“人”的子類“小紅”(Hong), 要求他:吃飯像小張一樣快

睡覺像小王一樣香

續(xù)秒像小江一樣熟練(喂)

你會(huì)怎么去實(shí)現(xiàn)呢?如果再要求你把上面三個(gè)要求換一換順序呢?

也許 Python 有許多其它的解決方案、但(我所知道的)最簡單的方法、就是使用元類了

幸運(yùn)的是,雖然元類的思想可能很深,但就這個(gè)簡單的問題而言、即使我不進(jìn)行任何說明、相信聰明的觀眾老爺們也能讀懂下面這幾塊代碼

先定義 Person 類:

class Person:

def __init__(self):

self.ability = 1

def eat(self):

print("Eat: ", self.ability)

def sleep(self):

print("Sleep: ", self.ability)

def save_life(self):

print("+ ", self.ability, " s")

再定義三個(gè)子類:

class Wang(Person):

def eat(self):

print("Eat: ", self.ability * 2)

class Zhang(Person):

def sleep(self):

print("Sleep: ", self.ability * 2)

class Jiang(Person):

def save_life(self):

print("+ inf s")

然后是最關(guān)鍵的、定義元類(Meta Class):

class Mixture(type):

def __new__(mcs, *args, **kwargs):

name, bases, attr = args[:3]

person1, person2, person3 = bases

def eat(self):

person1.eat(self)

def sleep(self):

person2.sleep(self)

def save_life(self):

person3.save_life(self)

attr["eat"] = eat

attr["sleep"] = sleep

attr["save_life"] = save_life

return type(name, bases, attr)

Done!可能會(huì)有觀眾老爺發(fā)現(xiàn)其中有三行代碼顯得“特別傻”——沒錯(cuò),確實(shí)可以用更具有普適性的三行代碼來代替我們上面倒數(shù)第二到第四行的代碼:

class Mixture(type):

def __new__(mcs, *args, **kwargs):

name, bases, attr = args[:3]

person1, person2, person3 = bases

def eat(self):

person1.eat(self)

def sleep(self):

person2.sleep(self)

def save_life(self):

person3.save_life(self)

for key, value in locals().items():

if str(value).find("function") >= 0:

attr[key] = value

return type(name, bases, attr)

拋開所有技術(shù)細(xì)節(jié)而只談應(yīng)用的話、其實(shí)上面這個(gè)栗子可能已經(jīng)相當(dāng)足夠了。接下來就讓我們測試一下這個(gè) Mixture元類吧。先來定義一個(gè)小的測試函數(shù),它依次調(diào)用 Person 實(shí)例吃飯、睡覺、續(xù)幾秒這三個(gè)動(dòng)作:

def test(person):

person.eat()

person.sleep()

person.save_life()

然后進(jìn)行兩組測試:

class Hong(Wang, Zhang, Jiang, metaclass=Mixture):

pass

test(Hong())

Out[2]:

Eat: 2

Sleep: 2

+ inf s

class Hong(Zhang, Wang, Jiang, metaclass=Mixture):

pass

test(Hong())

Out[3]:

Eat: 1

Sleep: 1

+ inf s

Done!可以看到、我們確實(shí)獲得了類的高度控制權(quán)

可能會(huì)有觀眾老爺想問,如果我直接繼承會(huì)發(fā)生什么事情?就這個(gè)栗子而言,如果定義一個(gè)類直接繼承小王、小張、小江的話,無論按什么順序繼承、結(jié)果都會(huì)是一樣的(猜猜這個(gè)結(jié)果會(huì)是什么? ( σ'ω')σ)

值得一提的是,可以看到我們定義的元類繼承自 type、這是因?yàn)?Python 自帶的元類就是 type

其實(shí)即使僅僅基于上述栗子的思想、就已經(jīng)可以搗鼓出許多有意思的應(yīng)用了。在我自己實(shí)現(xiàn)的神經(jīng)網(wǎng)絡(luò)中、我就用了這個(gè)思想來把普通 NN 里面的附加層(Dropout、Normalize)擴(kuò)展成了 CNN 里面的附加層,感興趣的觀眾老爺們可以看看這里面的 ConvSubMeta 類

我沒有講太多原理層面的東西,一方面是因?yàn)槲矣X得知道怎么用就好、另一方面是因?yàn)槲遗聛y說話遭報(bào)應(yīng)(……)

希望觀眾老爺們能夠喜歡~

總結(jié)

以上是生活随笔為你收集整理的python类的应用_Python · 元类(Meta Class)及其应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 在线播放国产精品 | 成人在线激情 | 国产一区二区福利 | 曰批女人视频在线观看 | 99精品视频免费看 | 欧美日韩在线免费观看视频 | 综合色伊人 | 久久96视频| 有码一区二区三区 | 久久久久久久久蜜桃 | 久久精品偷拍视频 | 亚洲中文字幕一区二区在线观看 | 亚洲视频一区二区三区四区 | 男操女视频在线观看 | 人妻偷人精品一区二区三区 | 97精品免费视频 | 成人国产精品久久久网站 | 黄色小视频在线播放 | 银娇在线观看 | 欧美理论片在线观看 | 久久99视频精品 | 久婷婷| 2017狠狠干| caopeng在线视频| 性欧美hd调教 | 欧美福利视频 | 91国模| 一级片视频播放 | 一区二区精品区 | 成人久久久精品乱码一区二区三区 | 免费手机av| av不卡一区二区三区 | 国产女人叫床高潮大片免费 | 免费看黄色片网站 | 国产情侣91 | 中文字幕一区二区三区av | 一级黄色片国产 | 初恋视频污 | 男女啪啪免费看 | 欧美aa视频| 俺去久久| 日本免费黄视频 | 97香蕉| 伊人青青久| 亚洲free性xxxx护士hd | 日韩精品电影一区 | 91福利网址| 欧美在线一二三区 | 鲁大师私人影院在线观看 | 中文字幕亚洲高清 | 日日夜夜爽爽 | 91毛片网站 | 中国少妇乱子伦视频播放 | 黄色网络在线观看 | 亚洲国产成人精品久久久 | 天天天av | 日韩极品视频 | 亚洲国产美女视频 | 在线看片中文字幕 | 亚洲免费在线视频观看 | 国产日韩视频在线观看 | 亚洲精品一二 | 上原亚衣av一区二区三区 | 亚洲欧美第一 | 色女人天堂 | 久草福利免费 | 欧美碰碰碰 | 国产国语videosex另类 | 色综合久久88色综合天天6 | 女裸全身无奶罩内裤内衣内裤 | 成人深夜福利视频 | 国产乱一区二区三区 | 日日av| 婷婷国产一区二区三区 | 日韩高清不卡 | 亚洲另类xxxx| 日韩欧美中文在线观看 | 亚洲欧美日韩综合一区二区 | 日本欧美一区 | 人妻丰满熟妇岳av无码区hd | 玩偶姐姐在线观看免费 | 夜夜嗨av一区二区三区 | 精品蜜桃一区二区三区 | 成人不卡视频 | 日韩精品中文字幕在线播放 | 色五丁香 | 国产精品伦理一区二区 | 成人欧美精品 | 国产精品久久久久久一区二区三区 | 国产三级国产精品 | 亚洲无码国产精品 | 女女互磨互喷水高潮les呻吟 | 成人中文字幕在线观看 | 欧美高清视频一区二区三区 | 最近最好的2019中文 | 欧美综合社区 | 国产精品一区二区欧美 | 欧美午夜精品一区二区蜜桃 | 日产精品一区 |