print("创建类")
"""
1、传统创建类
"""
class Student(object):
def __new__(cls,*args,**kwargs):
print("创建对象")
return super().__new__(cls)
def __init__(self):
print("初始化对象")
stu=Student()
print(stu)
"""
2、第二种创建方式
参数1 类名 Student1
参数2 继承谁 (object,)
参数3 成员 {"name":"zhangsan","age":18,"show":lambda self: "hello"}
"""
#返回类名
STU= type("Student1",(object,),{"name":"zhangsan","age":18,"show":lambda self: "hello"})
#创建对象
s1 =STU()
print("打印对象属性",s1.name)
print("打印对象函数",s1.show())
"""
TODO 问题: 类 默认是由于type创建的, 那么如何让一个类的创建 改成其他东西呢? 这里就出现了元类
默认是type创建的
class A(object):
pass
指定让某些东西创建类 举例
class A(object,metaclass=东西):
pass
实现
#该类继承元类type,用于约束控制类创建的过程,例如动态添加属性,控制类名大小写,
#继承关系 type——>object
class MyType(type):
pass
此时 A就是由MyType创建的了, 可以理解成A是MyType的一个实例,A是一个对象
class A(object,metaclass=MyType):
pass
"""
class MyType(type):
def __new__(cls, *args, **kwargs):
print("创建类开始")
new_cls=super().__new__(cls, *args, **kwargs)
print("创建类结束")
return new_cls
def __init__(self, *args,**kwargs):
print("初始化类开始")
super().__init__(*args,**kwargs)
print("初始化类结束")
def __call__(self, *args, **kwargs):
print("MyType 执行了call")
#1、调用 __new__函数
#2、调用 __init__函数
#3、返回对象
# 此时 A就是由MyType创建的了, 可以理解成A是MyType的一个实例,A是一个对象
class A(object,metaclass=MyType):...#...省略 有意留空
A() #因为A 属于MyType的对象 所以 调用A() 就会触发call函数, call函数是对象()触发的
# TODO 新概念 call函数是什么调用? 答案 对象() 对象加括号时就会调用
#
class B(object):
def __new__(cls, *args, **kwargs):
print("b __new__")
return super().__new__(cls)
def __init__(self, *args,**kwargs):
print("b __init__")
def __call__(self, *args, **kwargs):
print("B 执行了call")
#1、调用 __new__函数
#2、调用 __init__函数
b=B()
# b()