php做网站安全,wap网站界面,近期重大新闻,抖音代运营网本文实例讲述了Python 使用元类type创建类对象。分享给大家供大家参考#xff0c;具体如下#xff1a;type(123) 可以查看变量的类型;同时 type(类名,(父类),{类属性:值,类属性2:值}) 可以创建一个类。在Python中不建议一个函数具有不同的功能(重载)…本文实例讲述了Python 使用元类type创建类对象。分享给大家供大家参考具体如下type(123) 可以查看变量的类型;同时 type(类名,(父类),{类属性:值,类属性2:值}) 可以创建一个类。在Python中不建议一个函数具有不同的功能(重载)type()具有不同的功能是为了兼容之前的版本。类可以创建实例对象类对象是由元类创建的。 (元类创建类类创建实例对象)type就是元类(type本质上就是一个类)demo.py(用元类type创建类)# 通过class关键字创建类class MyClass1(object):name 张三 # 类属性 (所有实例对象共用)age 23# 通过type创建类。 type()返回的是创建的类对象的引用。Test2 type(MyClass2,(object,),{name:张三,age:23}) # Test2是MyClass2类的引用一般变量名和类名保持一致。print(Test2()) # __main__.myclass2 object atdemo.py(用type创建带有方法的类)# 实例方法def print_b(self):print(self.num)# 静态方法staticmethoddef print_static():print(----haha-----)# 类方法classmethoddef print_class(cls):print(cls.num)# 用type创建类B type(B, (object,), {num:100, print_b: print_b, print_static: print_static, print_class: print_class})b B()b.print_b() # 100b.print_static() # ----haha-----b.print_class() # 100元类的应用在定义一个类的时候可以为其指定__metaclass__属性(指定创建该类的元类)默认使用type元类创建类对象。通过指定自定义的元类可以对类的创建进行拦截。可以对类名、继承的父类、属性(方法)做一些预处理。例如将类名大写默认继承object类添加、修改属性(方法)名(私有属性的伪私有化就是通过修改属性名实现的)。装饰器是对函数进行功能扩展(不用修改原代码)而元类可以对类进行功能扩展(添加额外的属性/方法)。demo.py(用函数指定__metaclass__属性)#-*- coding:utf-8 -*-def upper_attr(class_name, class_parents, class_attr):# class_name 会保存类的名字 Foo# class_parents 会保存类的父类 object# class_attr 会以字典的方式保存所有的类属性/方法# 遍历属性字典把不是__开头的属性名字变为大写new_attr {}for name, value in class_attr.items():if not name.startswith(__):new_attr[name.upper()] value# 调用type来创建一个类return type(class_name, class_parents, new_attr)class Foo(object, metaclassupper_attr): # python3的方式# python2.x的方式。# __metaclass__ upper_attr # 设置Foo类的元类为upper_attrbar bipprint(hasattr(Foo, bar))print(hasattr(Foo, BAR))f Foo()print(f.BAR)demo.py(用类指定__metaclass__属性)class UpperAttrMetaClass(type):# __new__ 是在__init__之前被调用的特殊方法# __new__是用来创建对象并返回之的方法# 而__init__只是用来将传入的参数初始化给对象# 你很少用到__new__除非你希望能够控制对象的创建# 这里创建的对象是类我们希望能够自定义它所以我们这里改写__new__# 如果你希望的话你也可以在__init__中做些事情# 还有一些高级的用法会涉及到改写__call__特殊方法但是我们这里不用def __new__(cls, class_name, class_parents, class_attr):# 遍历属性字典把不是__开头的属性名字变为大写new_attr {}for name, value in class_attr.items():if not name.startswith(__):new_attr[name.upper()] value# 方法1通过type来做类对象的创建return type(class_name, class_parents, new_attr)# 方法2复用type.__new__方法# 这就是基本的OOP编程没什么魔法# return type.__new__(cls, class_name, class_parents, new_attr)# python3的用法class Foo(object, metaclassUpperAttrMetaClass):bar bip# python2的用法# class Foo(object):# __metaclass__ UpperAttrMetaClass# bar bipprint(hasattr(Foo, bar))# 输出: Falseprint(hasattr(Foo, BAR))# 输出:Truef Foo()print(f.BAR)# 输出:bip更多关于Python相关内容感兴趣的读者可查看本站专题《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》希望本文所述对大家Python程序设计有所帮助。本文标题: Python 使用元类type创建类对象常见应用详解本文地址: http://www.cppcns.com/jiaoben/python/281126.html