python元编程运用,python友元类
在Python中一切都是对象。数字、字符串和函数等基本数据类型都是对象。对象可以由类创建。那么既然一切都是对象,那么类也是对象吗?是的,类也是对象,那么是谁创建的呢?答案也很简单。它也是一个类,一个可以创建类的类,叫做(type)元类。
00-1010类I的定义什么是元类II?注意区分元类和继承的基类III。元类IV类型的使用。自定义元类的使用。
目录
对象由类创建,如下面的代码所示:
# object是顶级基类。
班级工作(对象):
a=100
Mywork=Work() #实例化
Print(MyWork) # Mywork是work _ _ main _ _创建的对象。0x101eb4630处的工作对象
print(type(my work))# class _ _ main _ _。“工作”
打印的类型(type(Work)) #是元类class type
解析:
您可以看到对象MyWork是由类Work创建的实例。但是,您可以看到工作类型是由一个名为type的类创建的实例。也就是我的作品——“作品——”式创作。
在上面的例子中,对象是动态创建的,而类是由关键字class声明定义的。
那么class关键字背后的玄机是什么呢?
其实像类Work(object)这样的代码相当于Work=type (Work ,(objects,){"a" 3360100}),也就是类type通过实例化来创建它的对象Work,而这个Work只是一个类,这样能创建类的类就是Python的元类。python中内置的元类叫做:type。
类的定义
用于创建类的类称为元类。类是由元类创建的对象函数。type实际上是一个元类,type是Python在后面用来创建所有类的元类。
一、什么是元类
Type是一个元类,所有类都是type创建的object顶层的基类,所有类继承的顶层父类都是object。
二、注意区分元类和继承的基类
可以看到type是小写的,一般认为是函数。查看源代码以了解以下定义:
类别类型(对象):
类型(对象或名称、基础、字典)
type(object) -对象的类型
类型(名称、基数、字典)-一种新类型
#实例化
def __init__(cls,what,bases=None,dict=None): #类型的已知特例。__init__
类型(对象或名称、基础、字典)
type(object) -对象的类型
类型(名称、基数、字典)-一种新类型
#(从类文档复制)
及格
#创建一个类
@staticmethod #已知情况__new__
def __new__(*args,**kwargs): #真实签名未知
创建并返回一个新对象。请参阅帮助(键入)以获得准确的签名。
(创建并返回一个新对象)
及格
类型的用法1:获取数据时的类型:类型(对象)-对象
quo;s type
a = 100b = "100"
c = [11,22,33]
print(type(a)) # ======》 <class int>
print(type(b)) # ======》 <class str>
print(type(c)) # ======》 <class list>
type的用法二:创建类:type(object_or_name, bases, dict)
1.在查看源码的时候,可以看到在初始化时,init__方法接受三个参数,type 在实例化的过程,也会重新创建一个新的类,而创建类的代码来自__new 方法,它的参数与 __init__方法是一样的。
2.当调用 type 进行实例化的时候,会先自动调用 new 方法,再调用__init__方法,最终会实例化一个对象,这个对象是一个类。
1. 元类 type 的 init 方法有3个参数:
1.name:类名(字符串类型)
2.bases:继承的父类(元祖类型)
3.dict:属性和方法组成的字典(字典类型)
具体例子:
# 通过 class 定义类class Myclass(object):
a = 100
b = 200
# 通过type创建的类(动态创建类)
Myclass1 = type("Myclass1",(object,),{"a":"100","b":"200"})
print(Myclass)
print(Myclass1)
如果需要定义实例方法和类属性怎么办呢?,将方法和属性以字典的形式传进去
def work(self):print("这是实例方法——————work————————")
# 定义类属性值
def init_method(self, aa, bb, cc):
self.aa = aa
self.bb = bb
self.cc = cc
# 通过type创建的类(动态创建类)
Myclass2 = type("Myclass2",(object,),{"a":"100","b":"200","work":work,"work_1":work_1,"__init__":init_method})
m = Myclass2(11,22,33)
m.work()
print(m.aa, m.bb, m.cc)
四、自定义元类的使用
既然元类可以创建类,那也可以自定义元类,自定义直接继承类 type ,在自定义元类的步骤:
1.定义一个类继承type
2.重写new方法
具体例子:
# 定义一个类继承typeclass Mytest(type):
# 重写new方法
def __new__(cls, type_name, bases, atter, *args, **kwargs):
new_cls = super().__new__(cls,type_name, bases, atter)
return new_cls # 返回新的类
M2 = Mytest("M2",(Mytest,),{"atter":100})
print(M2) # =====》 <class __main__.M2>
使用class创建类的时候指定自定义的元类
1.不去指定时,默认创建都是type类
2.指定自定义的元类去创建类:metaclass = 指定的元类
class Myclass(type):"""自定义的元类"""
def __new__(cls, type_name, bases, attrs, *args, **kwargs):
new_cls = super().__new__(cls, type_name, bases, attrs)
print("这个是Myclass:", type_name, bases, attrs, )
return new_cls
# 通过metaclass=xxxx 继承自定义元类
class Inherited_class(metaclass=Myclass):
a = 100
b = 200
print(type(Inherited_class)) # ======》 <class __main__.Myclass>
到此这篇关于Python超详细讲解元类的使用的文章就介绍到这了,更多相关Python元类内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。