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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

day24-1 元类

發布時間:2024/8/26 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 day24-1 元类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 元類
    • 類的組成
    • 內置函數 exec()
    • class關鍵字創建類原理
    • 自定義元類控制類的創建
    • 自定義元類控制類實例化
      • 自定義元類后對象屬性查找順序

元類

在python中一切皆對象,name我們用class關鍵字定義的類本身也是一個對象,負責產生該對象的類稱之為元類,即元類可以簡稱為類的類

元類是負責產生類的,所以我們學習元類或者定義元類的目的是:為了控制類的產生過程,還可以控制對象的產生過程

類的組成

class People(object):x = 1print('from people')def __init__(self, name, age):self.name = nameself.age = agedef speak(self):print('from speak')

在用class關鍵字定義類時,在定義階段會執行類體中的代碼,創建名稱空間,所以類由三部分組成

  • 類名class_name:People
  • 基類class_bases:(object,)
  • 類的名稱空間class_dic

內置函數 exec()

將字符串中的代碼執行,然后把產生的全局名稱丟入到global_space字典中,局部名稱丟入到local_space字典中

cmd = """ x = 1 global y y = 10 def __init__(self, name, age):self.name = nameself.age = agedef speak(self):print('from speak') """ global_space = {} local_space = {} exec(cmd,global_space,local_space) # 未聲明gloabal的變量全是局部變量 print('local:',local_space) local: {'x': 1, '__init__': <function __init__ at 0x000002C2319EB158>, 'speak': <function speak at 0x000002C2319EB0D0>}

class關鍵字創建類原理

用class關鍵字創建一個類,用的默認的元類type

class_name = 'P' # 類名 class_bases = (object,) # 基類 cmd = """ x = 1 global y y = 10 def __init__(self, name, age):self.name = nameself.age = agedef speak(self):print('from speak') """ global_space = {} local_space = {} exec(cmd,global_space,local_space) class_dic = local_space # 類的名稱空間P= type(class_name, class_bases, class_dic) print(P) <class '__main__.P'>

自定義元類控制類的創建

  • 控制創建類時必須寫說明,沒寫就拋出異常
class Mymeta(type):def __init__(self, class_name, class_bases, class_dict):if not class_dict.get('__doc__'):raise TypeError('必須寫說明')super(Mymeta, self).__init__(class_name, class_bases, class_dict)class People(object, metaclass=Mymeta):"""SJFDSFSD"""country = 'Chinese'def __init__(self, name, age):self.name = nameself.age = agedef test(self):print('from f1')
  • 控制創建類時類名不能全為小寫,類名全為小寫則拋出異常
class Mymeta(type):def __init__(self, class_name, class_bases, class_dict):if class_name.islower():raise TypeError('類名不能全為小寫')super(Mymeta, self).__init__(class_name, class_bases, class_dict)class People(object, metaclass=Mymeta):country = 'Chinese'def __init__(self, name, age):self.name = nameself.age = agedef test(self):print('from f1')

自定義元類控制類實例化

類的實例化就是元類的調用,類實例化原理:

  • 先造出一個空對象
  • 為該空對象初始化獨有的屬性
  • 返回一個初始化好的對象
class Mymeta(type):def __init__(self, class_name, class_bases, class_dict):super(Mymeta, self).__init__(class_name, class_bases, class_dict)# 控制類Foo的調用過程,即控制實例化Foo的過程def __call__(self, *args, **kwargs):# 造一個空對象objobj = object.__new__(self)# 調用Foo.__init__,將obj連同調用Foo括號內的參數一同傳給__init__self.__init__(obj, *args, **kwargs)return objclass Foo(object, metaclass=Mymeta):x = 10def __init__(self, y):self.y = yf = Foo(1) print(f.__dict__) {'y': 1}

自定義元類后對象屬性查找順序

對象本身-->類-->父類-->父類-->object-->type找不到報錯

轉載于:https://www.cnblogs.com/863652104kai/p/11083661.html

總結

以上是生活随笔為你收集整理的day24-1 元类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。