'''
1.什么是元类?
- 类的类就是type, 其实type就是元类;
2.元类的作用?
3.如何创建元类以及使用?
'''
# # 1.一切皆对象
# list1 = [] # list1 = list([])
# # print(type(list1)) # <class 'list'>
#
#
# # 2.自定一个类
# class Chinese(object):
# country = 'china'
# def __init__(self, name, age, sex):
# self.name = name
# self.age = age
# self.sex = sex
#
#
# p_obj = Chinese('tank', 17, 'male')
# # print(type(p_obj)) # <class '__main__.Chinese'>
# print(Chinese) # 类本质上也是一个对象,因为在python中 一切皆对象 ;
# # print(type(Chinese)) # <class 'type'>
#
#
# # 3.如何产生类的:
# # 1) 通过class关键字产生类
# # 2) 通过调用type类: type() ---> obj ---> Chinese
#
# # what: 指的是类名
# # bases: 继承的父类 (object, )
# # dict: 类的名称空间
#
#
# code = '''
# country = 'china'
# def __init__(self, name, age, sex):
# self.name = name
# self.age = age
# self.sex = sex
# '''
# # class_attr
# class_attr = {}
# exec(code, {}, class_attr)
#
#
# # type(类的名字, 类的基类, 类的名称空间) ----> 类 ---> 对象
# obj = type('Chinese', (object, ), class_attr) # def __init__(what, bases=None, dict=None)
# # print(obj)
# Chinese = obj
# print(Chinese)
# 1.什么是元类?
# 类的类就是type, 其实type就是元类;
# 2.为什么要使用元类???
# 元类可以控制类的创建过程!
# type是python内置的元类
# 自定义一个元类
class MyMetaClass(type):
# 控制类的创建
# 优酷需要用到的部分;
def __init__(self, class_name, class_bases, class_dict): # self, obj
print(type(class_name))
# print(class_name.istitle())
if not class_name.istitle():
raise NameError('类的首字母必须大写!')
if not class_dict.get('__doc__'):
raise TypeError('必须给我写注释!!!')
# 必须将类中的类名、类的基类、类的名称空间,一并返回给 type中的__init__
super().__init__(class_name, class_bases, class_dict)
# 了解: 元类更深层次的作用
# 控制调用类的行为
# 为什么调用类就一定会产生一个空对象,为什么一定会执行__new__
# 其实就是type内部一定会调用一次__call__,由__call__来帮你调用__new__。
# 元类中的__call__就是创建类的过程!!!
def __call__(self, *args, **kwargs):
print(args) # Foo类括号中的值
# 1.造一个空对象obj
obj = object.__new__(self) # 创造一个空的对象 # self ---> User
print(obj.__dict__, 1111111)
# 2.调用类时,__call__会立马调用User.__init__, 并且将obj连同Foo括号内的参数一同传给__init__
self.__init__(obj, *args, **kwargs)
# return一个真正创建的对象
return obj
# obj = MyMetaClass()
# obj() # obj() ----> User(10, 20) ----> user_obj
# 被控制类在定义阶段 类名(metaclass=自定义的元类) ---> 会将当前类的
# 1)类名、2)基类、3)类的名称空间 一并 传给 自定义的元类
# metaclass ---> 自定义的元类 ---> 调用自定义的元类(类名, 基类, 类的名称空间)
# type(类名, 基类, 类的名称空间)
class User(object, metaclass=MyMetaClass): # MyMetaClass(User, (object, ), {'x':10})
'''tank是真的很帅啊,真的舍不得你们啊!!!'''
def __init__(self):
pass
x = 10
pass