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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

元类及创建元类的方法(面试用

發(fā)布時間:2024/7/5 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 元类及创建元类的方法(面试用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
元類就是類的類,type就是Python中創(chuàng)建所有類的元類。type就是創(chuàng)建類對象的類。Python中所有的東西——都是對象。這包括整數(shù)、字符串、函數(shù)以及類。它們?nèi)慷际菍ο?#xff0c;且它們都是從個類創(chuàng)建來,這個類就是type # class Foo(object): #???? a = 100 # # 對于上面聲明類的代碼,實際上是由type幫助我們創(chuàng)建了類,具體可以理解為下面的過程 # # # type(類名, 基類/父類元祖, 方法與類屬性 字典)? ——> 返回創(chuàng)建出來的類 # # Foo = type("Foo", (object,), {"a": 100}) # # obj = Foo() ? ###################### # 使用type創(chuàng)建類 ? # 對象方法 def obj_fun(self): ??? print("obj_fun") ? # 類方法 @classmethod def class_fun(cls): ??? print("class_fun called") ? # 靜態(tài)方法 @staticmethod def static_fun(): ??? print("static fun called") ? # 通過type創(chuàng)建一個類,然后找了一個變量bar來接收 bar = type("Foo", (object,), {"a": 100, "o_fun": obj_fun, "c_fun": class_fun, "s_fun": static_fun}) ? # print(bar.__name__) obj = bar() obj.o_fun() ? # print(type(obj)) # # print(bar.a) bar.c_fun() bar.s_fun() ? ? # 用函數(shù)的語法自己定義了一個元類? upper_meta_class def upper_meta_class(class_name, class_bases, class_attrs): ??? """自己定義的元類""" ?? ?# class_name 用來接收類名? 字符串 ??? # class_bases 用來接收基類? 元祖 ??? # class_attrs 用來接收屬性? 字典? {"a":100, "b": 200} ? ??? new_class_attrs = {} ?? ?# 通過循環(huán)遍歷class_attrs 調(diào)整里面的鍵值對,放到new_class_attrs ??? for key, value in class_attrs.items(): ??????? new_class_attrs[key.upper()] = value ? ??? # new_class_attrs = {"A": 100, "B": 200} ? ??? return type(class_name, class_bases, new_class_attrs) ? ? # 使用元類的方法 class Foo(object, metaclass=upper_meta_class): ??? a = 100 ??? b = 200 ? ? # Foo = upper_meta_class("Foo", (object,), {"a":100, "b": 200}) ? # print(Foo.a) print(Foo.A) ? ? ? class upper_meta_class(type): ??? """自定義元類""" ??? def __new__(cls, class_name, class_bases, class_attrs): ??????? """決定了對象的真實構造過程,對象是由new方法創(chuàng)造出來的""" ? ??????? new_class_attrs = {} ??????? # 通過循環(huán)遍歷class_attrs 調(diào)整里面的鍵值對,放到new_class_attrs ??????? for key, value in class_attrs.items(): ??????????? new_class_attrs[key.upper()] = value ? ??????? # new_class_attrs = {"A": 100, "B": 200} ? ??????? # return type(class_name, class_bases, new_class_attrs) ? ?? ?????# 子類中調(diào)用父類的三種方法: ?????? ?#1. return type.__new__(cls, class_name, class_bases, new_class_attrs) ????? ??#2. return super().__new__(cls, class_name, class_bases, new_class_attrs) ???? ??3. return super(upper_meta_class, cls).__new__(cls, class_name, class_bases, new_class_attrs) ? ? ??? # def __init__(self, class_name, class_bases, class_attrs): ??? #???? """初始化方法,對象已經(jīng)存在,只是為對象進行屬性設置""" ? # python3 使用元類的方法 class Foo(object, metaclass=upper_meta_class): ??? a = 100 ??? b = 200 # # # python2 使用元類的方法 # class Foo(object): #???? ___metaclass__ = upper_meta_class #???? a = 100 #???? b = 200 ? ? # Foo = upper_meta_class("Foo", (object,), {"a":100, "b": 200}) ? # print(Foo.a) print(Foo.A) ? 就是這樣,除此之外,關于元類真的沒有別的可說的了。但就元類本身,它們其實是很簡單的:
  • 攔截類的創(chuàng)建
  • 修改類
  • 返回修改之后的類究竟為什么要使元類?
  • “元類就是深度的魔法,99%用戶根本不必為此操?。如果你想搞清楚究竟是否需要到元類,那么你就不需要它。??? ——Python界的領袖??? Tim??? Peters

    總結

    以上是生活随笔為你收集整理的元类及创建元类的方法(面试用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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