元类的基础推导流程

发布时间 2023-03-22 21:16:48作者: MrSphere

# class Dog:
#     pass
#
#
# print(Dog.__class__,Dog.mro())
#
#
# class Cat(object):
#     pass
#
#
# print(Cat.__class__,Cat.mro())


# keywords class to create the classes 's steps:
# the core of a type class :
# 1. class name ,  character 1
# 2. class's base class, if there is no args ,it was signment object to it.
# 3. inside the class body, there should be an area to place functions,it's a dict
# # 1. 创建类的名字
# class_name = 'People'
# # 2. 指定创建类的基类
# class_bases = (object,)
# # 3. 往类的名称空间储存类体
# class_dict = {}
# class_body = """
# def __init__(self,name,age):
#     self.name = name
#     self.age = age
#
# def say(self):
#     print(self.name)
#
# """
# exec(class_body, {}, class_dict)
# # print(class_dict)
# # class 会比自己造的名称空间更强大,自己放不了太全面的内置名称空间
# # 4. 调用元类
# People = type(class_name, class_bases, class_dict)
# print(People, People.mro())
# # 实例化元类,产生新类 People
# # 5.结论,因此说所有类都是由原类生成
# '''
# class People():
#     def __init__(self,name,age):
#         self.name = name
#         self.age = age
#
# '''
#
#
# # 定制元类 对class_name,class_bases,class_dict 进行控制类的产生
# class MyMeta(type):  # 只有继承了type的类才是元类
#     # 空对象, 'People', (object,),{...}这三个参数
#     # def __init__(self):
#     #     print('run....')
#     # TypeError: MyMeta.__init__() takes 1 positional argument but 4 were given
#     def __init__(self, x, y, z):
#         print('run ...')
#         # print(x) # People
#         print(y)  # () 因为这已经是底层,因此没有给他赋值,也没有人给他赋值,class 底层可以加object
#         print(self.__bases__)  # (<class 'object'>,)
#         # print(z) # {'__module__': '__main__', '__qualname__': 'People', '__init__': <function People.__init__ at 0x0000019270B21990>, 'speak': <function People.speak at 0x0000019270B21A20>}
#         if not x.istitle():
#             raise NameError('first letter of class should be upper !')
#
#     def __new__(cls, *args, **kwargs):
#         # print('111') 确认先 执行了
#         print(cls,args,kwargs) # 先打印看是什么
#         # return cls(*args,**kwargs)
#         # 神奇的new的绑定方法竟然是cls
#         # 创建某个类的空对象,给这个类传入不定长形参 和位置形参
#         return type.__new__(cls,*args,**kwargs)
#         # 在init 前要做什么事情的话,就在这里加代码拦截 ,这里没有用super()?待测试
#
#
#     def __call__(self, *args, **kwargs):
#         pass
#
#     '''
#     '''
#
# class People(metaclass=MyMeta):
#     def __init__(self, name, age):
#         self.name = name
#         self.age = age
#
#     def speak(self):
#         print(f'{self.name} : {self.age}')
#
#
# # 研究People这个类作为对象产生的流程
# # People = MyMeta(class_name, class_bases,class_dict)
# # 调用MyMeta 发生的三件事情
# # 1. 先造一个名为 People的空对象,
# # 2. 调用MyMeta 类内的__init__方法,完成初始化对象的操作
# # 3. 返回初始化好的对象
# #
#
# '''
#
#
# '''
# class Foo:
#     def __init__(self,x,y):
#         self.x = x
#         self.y = y

class META(type):
    def __init__(self, x, y, z):
        print('22222222222')

    def __new__(cls, *args, **kwargs):
        print('111111111111111')
        return type.__new__(cls, *args, **kwargs)

    # def __call__(self, *args, **kwargs):
    #     return self(*args,**kwargs)
    def __call__(self, *args, **kwargs):
        return 123123


class People(metaclass=META):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def say(self):
        print(f'{self.name}')

    def __call__(self, name, age):
        print(f'{self.name}')
        return self.name * self.age