介绍
这篇文章将为大家详细讲解有关如何在Python中使用元类类型创建类对象,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
具体如下:
<代码>类型(“123“)代码>可以查看变量的类型;同时<代码>类型(“类名”,(父类),{类属性:值,类属性2:值})代码>可以创建一个类。
在Python中不建议一个函数具有不同的功能(重载);类型()具有不同的功能是为了兼容之前的版本。
类可以创建实例对象,类对象是由元类创建的。(元类创建类,类创建实例对象)
类型就是元类(本型质上就是一个类)
<强>演示。py(用元类类型创建类):强>
#,通过类关键字创建类 class MyClass1(对象): name =,才能“张三“,#,类属性,(所有实例对象共用) age 才能=23 #,通过类型创建类只类型()返回的是创建的类对象的引用。 时间=Test2 类型(“MyClass2"(对象),{“name":“张三“,“age": 23}), #, Test2是MyClass2类的引用,一般变量名和类名保持一致。 print (Test2 ()), #, & lt; __main__.MyClass2 object at 0 x7fa05a4ca9e8>
<强>演示。py(用类型创建带有方法的类):强>
#,实例方法 def print_b(自我): 打印(self.num)才能 #,静态方法 @staticmethod def print_static (): 打印才能(“——哈哈——产生绯闻。) #,类方法 @classmethod def print_class (cls): 打印(cls.num)才能 #,用类型创建类 B =,类型(“B",,(对象),{“num": 100年,“print_b":, print_b,,“print_static":, print_static,,“print_class":, print_class}) b =, B () b.print_b (),, #, 100 b.print_static(), #——哈哈- - - - - - b.print_class (),, #, 100
<强>元类的应用强>
在定义一个类的时候可以为其指定__metaclass__属性(指定创建该类的元类),默认使用类型元类创建类对象。
通过指定自定义的元类,可以对类的创建进行拦截。可以对类名,继承的父类,属性(方法)做一些预处理。
例如:将类名大写,默认继承对象类,添加,修改属性(方法)名(私有属性的伪私有化就是通过修改属性名实现的)。
装饰器是对函数进行功能扩展(不用修改原代码),而元类可以对类进行功能扩展(添加额外的属性/方法)。
<强>演示。py(用函数指定__metaclass__属性):强>
# - *安康;编码:utf-8 - * - def upper_attr (class_name, class_parents,, class_attr): #,才能class_name 会保存类的名字,Foo #,才能class_parents 会保存类的父类,对象 #,才能class_attr 会以字典的方式保存所有的类属性/方法 #才能,遍历属性字典,把不是__开头的属性名字变为大写 new_attr 才能=,{} for 名字,才能,value 拷贝class_attr.items (): ,,,if not name.startswith (“__"): ,,,,,new_attr [name.upper()],=,价值 #,才能调用类型来创建一个类 return 才能;类型(class_name, class_parents,, new_attr) class Foo(对象,,元类=upper_attr):, #, python3的方式 #,才能python2.x的方式。 #,才能__metaclass__ =, upper_attr #,设置Foo类的元类为upper_attr 时间=bar 才能;& # 39;毕普# 39; 打印(hasattr (Foo, & # 39;酒吧# 39;)) 打印(hasattr (Foo, & # 39;酒吧# 39;)) 时间=f Foo () 打印(f.BAR)
<强>演示。py(用类指定__metaclass__属性):强>
class UpperAttrMetaClass(类型): #,才能__new__ 是在__init__之前被调用的特殊方法 #,才能__new__是用来创建对象并返回之的方法 #才能,而__init__只是用来将传入的参数初始化给对象 #才能,你很少用到__new__,除非你希望能够控制对象的创建 #才能,这里,创建的对象是类,我们希望能够自定义它,所以我们这里改写__new__ #才能,如果你希望的话,你也可以在__init__中做些事情 #才能,还有一些高级的用法会涉及到改写__call__特殊方法,但是我们这里不用 def 才能__new__ (cls, class_name,, class_parents,, class_attr): ,,,#,遍历属性字典,把不是__开头的属性名字变为大写 ,,,new_attr =, {} ,,,for 名字,,value 拷贝class_attr.items (): ,,,,,if not name.startswith (“__"): ,,,,,,,new_attr [name.upper()],=,价值 ,,,#,方法1:通过& # 39;类型# 39;来做类对象的创建 ,,,return 类型(class_name, class_parents,, new_attr) ,,,#,方法2:复用type.__new__方法 ,,,#,这就是基本的OOP编程,没什么魔法 ,,,#,return type.__new__ (class_name, cls,还以为,class_parents, new_attr) #,python3的用法 class Foo(对象,,元类=UpperAttrMetaClass): 时间=bar 才能;& # 39;毕普# 39; #,python2的用法 #,class Foo(对象): #,,,__metaclass__ =UpperAttrMetaClass #,,,bar =, & # 39;毕普# 39; 打印(hasattr (Foo, & # 39;酒吧# 39;)) #,输出:假 打印(hasattr (Foo, & # 39;酒吧# 39;)) #,输出:没错 时间=f Foo () 打印(f.BAR) #,输出:& # 39;毕普# 39;如何在Python中使用元类类型创建类对象