ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python元编程详细教程

2021-09-08 19:04:13  阅读:195  来源: 互联网

标签:__ 教程 name Python 编程 bases print MyClass type


简单定义“元编程是一种编写计算机程序的技术,这些程序可以将自己看做数据,因此你可以在运行时对它进行内审、生成和/或修改”,本博参考<<Python高级编程>>将对元编程内容进行详细描述,若有不正确之处希望大家指出。

1. 概述

Python元编程有两种方法,一是采用类似“装饰器”的工具对基本元素(例如函数、类、类型)内审和对其进行实时创建和修改,二是运用类型"元类"的方式对类实例的创建过程进行修改,甚至于允许重新设计Python面对对象编程范式的实现。

2. 装饰器

对wraps装饰器的使用进行补充说明,在类装饰器中使用闭包会导致生成的对象不再是被装饰的类的实例,二是在装饰器函数创建的子类的实例,这会影响__name____doc__等属性,在上篇我们使用@wraps装饰器对函数装饰器进行操作让问题得到解决,但在类装饰器中这一方法无效。

3. 元类

元类是Python的一个重要特性,是定义其他类的类,理解其工作方式,最重要的是要知道定义了对象实例的类也是对象,那么它一定有与其相关联的类,所有的类定义的基类都是内置的type类。

#coding=utf-8

class MyClass:
    pass

if __name__ == "__main__":
    myclass = MyClass()
    print ("type of myclass:", type(myclass))
    print ("type of MyClass:", type(MyClass))
>>> type of myclass: <class '__main__.MyClass'>
>>> type of MyClass: <class 'type'>

3.1 type()语法

type()类作为class语句的动态等效,给定类名,基类名和属性映射会创建一个新类

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def func1(self):
    print (1)

def func2(*argv):
    print (argv)

if __name__ == "__main__":
    MyClass = type("MyClass",(object, ), {"func1":func1, "func2":func2})
    a = MyClass()
    print (type(a))
    a.func1()
    a.func2(2)
>>> <class '__main__.MyClass'>
>>> 1
>>> (<__main__.MyClass object at 0x01A02270>,2)

3.2 元类的常用模板

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
'''元类模板 '''
class MyClass(type):
#创建一个空的命名空间,返回一个空的dict   
    @classmethod
    def __prepare__(mcs, name, bases, **kwargs):
        print ("MyClass __prepare__")
        return super().__prepare__(name, bases, **kwargs)   

    def __new__(mcs, name, bases, namespace):
        print ("MyClass __new__")
        return super().__new__(mcs, name, bases, namespace)

    def __init__(cls, name, bases, namespace, **kdargv):
        print ("MyClass __init__")   
        super().__init__(name, bases, namespace)

    def __call__(cls, *argv, **kdargv):
        print ("MyClass __call__")
        return super().__call__(*argv, **kdargv)

class _MyClass(metaclass=MyClass):
    def __new__(cls):
        print ("_MyClass __new__")
        return super().__new__(cls)

    def __init__(self):
        print("__MyClass __init__")
        super().__init__()

if __name__ == "__main__":
    a =  _MyClass()
>>> MyClass __prepare__
>>> MyClass __new__
>>> MyClass __init__
>>> MyClass __call__
>>> _MyClass __new__
>>> __MyClass __init_

用class语句创建的每个类都隐式的使用type作为元类,可以用metaclass=“指定元类”的方式改变这一默认行为。

3.3 元类的使用

元类是一种非常强大的特性,但总是会是代码更加复杂,将其用于任意类型的类时,这可能会降低代码的鲁棒性,我们必须灵活的使用元类。

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class OrderedMeta(type):
    @classmethod
    def __prepare__(mcs, name, bases, **kdargv):
        return super().__prepare__(mcs, name, bases, **kdargv)

    def __new__(mcs, name, bases, namespace):
        namespace["orderofattr"] = list(namespace.keys())
        return super().__new__(mcs, name, bases, namespace)
        
class test(metaclass = OrderedMeta):
    first = 8
    secord = 2

if __name__ == "__main__":
    print (test.orderofattr)    
    print (test.__dict__.keys())
>>> ['__module__', '__qualname__', 'first', 'secord']
>>> dict_keys(['__module__', 'first', 'secord', 'orderofattr', '__dict__', '__weakre
>>> f__', '__doc__'])

标签:__,教程,name,Python,编程,bases,print,MyClass,type
来源: https://blog.csdn.net/sinat_38682860/article/details/120186577

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有