如何在Python中使用元类类型创建类对象

  介绍

这篇文章将为大家详细讲解有关如何在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中使用元类类型创建类对象