元类

1.元类:类实例化得到对象,元类实例化得到类,类也可以看作对象,默认使用关键字class定义的类的元类为type
推论:可见class关键字在创建类时底层代码逻辑调用了type元类
2.模拟class关键字底层代码逻辑实现非class关键字定义类

# 1.定义类名
class_name = 'MyClass'
# 2.定义继承的父类
class_bases = (object, )
# 3.类的成员属性和方法
class_dic = {}
class_body = '''
"""
这是我定义的元类

"""
property = '非class关键字创建类'

def __init__(self, name, age):
	self.name = name
	self.age = age
	
def func(self):
	print('232132%s' % self.name)
	
'''

exec(class_body, {}, class_dic)

# 使用非class关键字定义一个类
MyClass = type(class_name, class_bases, class_dic)

3.自定义元类

import re
class Mymeta(type):
	# 自动传入继承元类所要创建类的类名,继承的父类,以及成员属性和方法的名称字典进行逻辑判定
	def __init__(self, class_name, class_bases, class_dic):
		if not re.search('[A-Z]', class_name):
			raise BaseException('必须使用驼峰体命名类名!')
		if len(class_bases) == 0:
			raise BaseException('至少需要继承一个类')
		if not (class_dic.get('__doc__') and len(class_dic.get('__doc__').strip()) > 0):
			raise BaseException('必须标注说明文档,且内容不能为空!')
	# 定义继承我的元类Mymeta的类创建对象时触发魔术方法call时代码逻辑,实际继承的type的call魔术方法也是这一套代码实现
	def __call__(self, *args, **kwargs):
		# 创建一个传入的类的空对象
		obj = object.__new__(self)
		# 调用传入类的init函数对空对象obj进行初始化属性
		self.__init__(obj, *args, **kwargs)
		# 返回完成初始化的对象
		return obj
# 	定义一个类,使用metaclass接收自定义的元类进行继承
class MyClass(object, metaclass=Mymeta):
	'''
	婚纱打开手机
	'''
	def __init__(self, name, age, salary):
		self.info = (name, age, salary)

	def fun(self):
		print(self.info)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值