# 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
元类的基础推导流程
发布时间 2023-03-22 21:16:48作者: MrSphere