电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Python如何定義有可選參數的元類

瀏覽:6日期:2022-07-15 17:09:54

問題

你想定義一個元類,允許類定義時提供可選參數,這樣可以控制或配置類型的創建過程。

解決方案

在定義類的時候,Python允許我們使用 ``metaclass``關鍵字參數來指定特定的元類。 例如使用抽象基類:

from abc import ABCMeta, abstractmethodclass IStream(metaclass=ABCMeta): @abstractmethod def read(self, maxsize=None): pass @abstractmethod def write(self, data): pass

然而,在自定義元類中我們還可以提供其他的關鍵字參數,如下所示:

class Spam(metaclass=MyMeta, debug=True, synchronize=True): pass

為了使元類支持這些關鍵字參數,你必須確保在 __prepare__() , __new__() 和 __init__() 方法中 都使用強制關鍵字參數。就像下面這樣:

class MyMeta(type): # Optional @classmethod def __prepare__(cls, name, bases, *, debug=False, synchronize=False): # Custom processing pass return super().__prepare__(name, bases) # Required def __new__(cls, name, bases, ns, *, debug=False, synchronize=False): # Custom processing pass return super().__new__(cls, name, bases, ns) # Required def __init__(self, name, bases, ns, *, debug=False, synchronize=False): # Custom processing pass super().__init__(name, bases, ns)

討論

給一個元類添加可選關鍵字參數需要你完全弄懂類創建的所有步驟, 因為這些參數會被傳遞給每一個相關的方法。 __prepare__() 方法在所有類定義開始執行前首先被調用,用來創建類命名空間。 通常來講,這個方法只是簡單的返回一個字典或其他映射對象。 __new__() 方法被用來實例化最終的類對象。它在類的主體被執行完后開始執行。 __init__() 方法最后被調用,用來執行其他的一些初始化工作。

當我們構造元類的時候,通常只需要定義一個 __new__() 或 __init__() 方法,但不是兩個都定義。 但是,如果需要接受其他的關鍵字參數的話,這兩個方法就要同時提供,并且都要提供對應的參數簽名。 默認的 __prepare__() 方法接受任意的關鍵字參數,但是會忽略它們, 所以只有當這些額外的參數可能會影響到類命名空間的創建時你才需要去定義 __prepare__() 方法。

通過使用強制關鍵字參數,在類的創建過程中我們必須通過關鍵字來指定這些參數。

使用關鍵字參數配置一個元類還可以視作對類變量的一種替代方式。例如:

class Spam(metaclass=MyMeta): debug = True synchronize = True pass

將這些屬性定義為參數的好處在于它們不會污染類的名稱空間, 這些屬性僅僅只從屬于類的創建階段,而不是類中的語句執行階段。 另外,它們在 __prepare__() 方法中是可以被訪問的,因為這個方法會在所有類主體執行前被執行。 但是類變量只能在元類的 __new__() 和 __init__() 方法中可見。

以上就是Python如何定義有可選參數的元類的詳細內容,更多關于Python定義元類的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 政府回应:200块在义乌小巷能买到爱情吗?——揭秘打工族省钱约会的生存智慧 | 液压压力机,液压折弯机,液压剪板机,模锻液压机-鲁南新力机床有限公司 | 交联度测试仪-湿漏电流测试仪-双85恒温恒湿试验箱-常州市科迈实验仪器有限公司 | 不锈钢电动球阀_气动高压闸阀_旋塞疏水调节阀_全立阀门-来自温州工业阀门巨头企业 | 不锈钢电动球阀_气动高压闸阀_旋塞疏水调节阀_全立阀门-来自温州工业阀门巨头企业 | 锂电池生产厂家-电动自行车航模无人机锂电池定制-世豹新能源 | 步进电机_agv电机_伺服马达-伺服轮毂电机-和利时电机 | 广东高华家具-公寓床|学生宿舍双层铁床厂家【质保十年】 | 横河变送器-横河压力变送器-EJA变送器-EJA压力变送器-「泉蕴仪表」 | 无味渗透剂,泡沫抑尘剂,烷基糖苷-威海威能化工有限公司 | 杭州代理记账费用-公司注销需要多久-公司变更监事_杭州福道财务管理咨询有限公司 | ICP备案查询_APP备案查询_小程序备案查询 - 备案巴巴 | 基业箱_环网柜_配电柜厂家_开关柜厂家_开关断路器-东莞基业电气设备有限公司 | 磷酸肌酸二钠盐,肌酐磷酰氯-沾化欣瑞康生物科技 | 深圳善跑体育产业集团有限公司_塑胶跑道_人造草坪_运动木地板 | 气力输送设备_料封泵_仓泵_散装机_气化板_压力释放阀-河南锐驰机械设备有限公司 | 测试治具|过炉治具|过锡炉治具|工装夹具|测试夹具|允睿自动化设备 | 培训无忧网-教育培训咨询招生第三方平台| 电子巡更系统-巡检管理系统-智能巡检【金万码】 | 烟台螺纹,烟台H型钢,烟台钢材,烟台角钢-烟台市正丰金属材料有限公司 | 彩信群发_群发彩信软件_视频短信营销平台-达信通 | 甲级防雷检测仪-乙级防雷检测仪厂家-上海胜绪电气有限公司 | 工业车间焊接-整体|集中除尘设备-激光|等离子切割机配套除尘-粉尘烟尘净化治理厂家-山东美蓝环保科技有限公司 | 一体化污水处理设备,一体化污水设备厂家-宜兴市福源水处理设备有限公司 | 西装定制/做厂家/公司_西装订做/制价格/费用-北京圣达信西装 | 捷码低代码平台 - 3D数字孪生_大数据可视化开发平台「免费体验」 | 伊卡洛斯软装首页-电动窗帘,别墅窗帘,定制窗帘,江浙沪1000+别墅窗帘案例 | 防水套管厂家_刚性防水套管_柔性防水套管_不锈钢防水套管-郑州中泰管道 | 水轮机密封网 | 水轮机密封产品研发生产厂家 | 带压开孔_带压堵漏_带压封堵-菏泽金升管道工程有限公司 | 2025黄道吉日查询、吉时查询、老黄历查询平台- 黄道吉日查询网 | 河南新乡德诚生产厂家主营震动筛,振动筛设备,筛机,塑料震动筛选机 | 广州云仓代发-昊哥云仓专业电商仓储托管外包代发货服务 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | PAS糖原染色-CBA流式多因子-明胶酶谱MMP-上海研谨生物科技有限公司 | 微水泥_硅藻泥_艺术涂料_艺术漆_艺术漆加盟-青岛泥之韵环保壁材 武汉EPS线条_EPS装饰线条_EPS构件_湖北博欧EPS线条厂家 | 考勤系统_人事考勤管理系统_本地部署BS考勤系统_考勤软件_天时考勤管理专家 | 有机废气处理-rto焚烧炉-催化燃烧设备-VOC冷凝回收装置-三梯环境 | 宜兴市恺瑞德环保科技有限公司 | 袋式过滤器,自清洗过滤器,保安过滤器,篮式过滤器,气体过滤器,全自动过滤器,反冲洗过滤器,管道过滤器,无锡驰业环保科技有限公司 | 灰板纸、灰底白、硬纸板等纸品生产商-金泊纸业 |