python 面向对象编程 之 元类
Posted yanxiatingyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 面向对象编程 之 元类相关的知识,希望对你有一定的参考价值。
元类是类的类,使我们自定义的类,即我们用class定义类本质就是元类,是类的模板
四步走:
一:控制class定义类的过程
1.先拿到类名
2.在拿到基类
3.执行类体代码,得到名称空间的dict
4.调用元类将三个参数传递进去
#其实class 是上面四步的封装。(隔离了复杂度)
二:自定义元类
class Mymeta(type):
def __init__(self,class_name,class_base,class_dic):
super().__init__(class_name,class_base,class_dic)
class My(object,metaclass=Mymeta):
pass
三:控制类与对象的产生
class Bar:
def __call__(self, *args, **kwargs):
print(self)
print(args)
print(kwargs)
bar = Bar()
bar(‘test‘)#对象后面加括号触发
class Mymeta(type):
def __init__(self, class_name, class_base, class_dic):
‘‘‘
:param class_name: 类名
:param class_base: 基类
:param class_dic: 名称空间
‘‘‘
if not class_name.istitle():
raise ValueError(‘类名需要大小写‘)
if class_dic.get(‘__doc__‘):
content = class_dic.get(‘__doc__‘)
content = content.replace(‘ ‘, ‘‘)
content = content.replace(‘ ‘, ‘‘)
if len(content)==0:
raise ValueError(‘类不能没有注释‘)
if ‘__doc__‘ not in class_dic or not clas_dic.get(‘__doc__‘).strip():
raise TypeError(‘必须为类指定文档注释‘)
super(Mymeta, self).__new__(class_name, class_name, class_dic)
class Mysql:
‘‘‘
‘‘‘
def __init__(self, Host, Port):
self.Host = Host
self.Port = Port
#创建类的两种方式
方式一:、
使用class关键字
class People(object):
def talk(self):
print(‘你好‘)
def walk(self):
print(‘走路‘)
方式二:
手动模拟class创建类的过程:将创建类的步骤拆分来,手动去创建、
手动创建需要三个条件,
需要分别拿到
1.类名
2.类的父类
3.类体(执行后得到名称空间的dict)
class_name=People
class_base=object
class_body= ‘‘‘ #类体
def talk(self):
print(‘你好‘)
def walk(self):
print(‘走路‘)
‘‘‘
cla=2wss_dic={}
步骤一(先处理类体->名称空间):类体定义的名字都会存放于类的名称空间中(一个局部的名称空间),我们可以事先定义一个空字典,然后用exec去执行类体代码
(exec产生名称空间的过程与真正的class过程类似,只是后者会将_开头的属性变形,生成类的局部名称空间,即填充字典)
exec(class_body,globals,class_dic)
步骤二:
People=type(class_name,class_base,class_dic)
#实例化type得到对象Foo,即我们得到对象People,即我们用class定义的类People
一个没有显示的声明自己的元类,默认继承的就是type
88
以上是关于python 面向对象编程 之 元类的主要内容,如果未能解决你的问题,请参考以下文章