Python元编程详细教程

待我称王封你为后i 2022-09-10 13:21 272阅读 0赞

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

1. 概述

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

2. 装饰器

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

3. 元类

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

  1. #coding=utf-8
  2. class MyClass:
  3. pass
  4. if __name__ == "__main__":
  5. myclass = MyClass()
  6. print ("type of myclass:", type(myclass))
  7. print ("type of MyClass:", type(MyClass))
  8. >>> type of myclass: <class '__main__.MyClass'>
  9. >>> type of MyClass: <class 'type'>

3.1 type()语法

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

  1. ''' 学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! '''
  2. def func1(self):
  3. print (1)
  4. def func2(*argv):
  5. print (argv)
  6. if __name__ == "__main__":
  7. MyClass = type("MyClass",(object, ), { "func1":func1, "func2":func2})
  8. a = MyClass()
  9. print (type(a))
  10. a.func1()
  11. a.func2(2)
  12. >>> <class '__main__.MyClass'>
  13. >>> 1
  14. >>> (<__main__.MyClass object at 0x01A02270>,2)

3.2 元类的常用模板

  1. ''' 学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! '''
  2. '''元类模板 '''
  3. class MyClass(type):
  4. #创建一个空的命名空间,返回一个空的dict
  5. @classmethod
  6. def __prepare__(mcs, name, bases, **kwargs):
  7. print ("MyClass __prepare__")
  8. return super().__prepare__(name, bases, **kwargs)
  9. def __new__(mcs, name, bases, namespace):
  10. print ("MyClass __new__")
  11. return super().__new__(mcs, name, bases, namespace)
  12. def __init__(cls, name, bases, namespace, **kdargv):
  13. print ("MyClass __init__")
  14. super().__init__(name, bases, namespace)
  15. def __call__(cls, *argv, **kdargv):
  16. print ("MyClass __call__")
  17. return super().__call__(*argv, **kdargv)
  18. class _MyClass(metaclass=MyClass):
  19. def __new__(cls):
  20. print ("_MyClass __new__")
  21. return super().__new__(cls)
  22. def __init__(self):
  23. print("__MyClass __init__")
  24. super().__init__()
  25. if __name__ == "__main__":
  26. a = _MyClass()
  27. >>> MyClass __prepare__
  28. >>> MyClass __new__
  29. >>> MyClass __init__
  30. >>> MyClass __call__
  31. >>> _MyClass __new__
  32. >>> __MyClass __init_

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

3.3 元类的使用

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

  1. ''' 学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! '''
  2. class OrderedMeta(type):
  3. @classmethod
  4. def __prepare__(mcs, name, bases, **kdargv):
  5. return super().__prepare__(mcs, name, bases, **kdargv)
  6. def __new__(mcs, name, bases, namespace):
  7. namespace["orderofattr"] = list(namespace.keys())
  8. return super().__new__(mcs, name, bases, namespace)
  9. class test(metaclass = OrderedMeta):
  10. first = 8
  11. secord = 2
  12. if __name__ == "__main__":
  13. print (test.orderofattr)
  14. print (test.__dict__.keys())
  15. >>> ['__module__', '__qualname__', 'first', 'secord']
  16. >>> dict_keys(['__module__', 'first', 'secord', 'orderofattr', '__dict__', '__weakre
  17. >>> f__', '__doc__'])

发表评论

表情:
评论列表 (有 0 条评论,272人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Python基础教程详细使用

    元组 元组和列表类似,但属于不可变序列,元组一旦创建,用任何方法都不可修改其元素。 元组的定义方式和列表相同,但定义时所有元素是放在一对圆括号“()”中,而不是方括号中。