传统创建类与type创建类与元类

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()

 

posted @ 2025-04-12 22:43  郎小乐  阅读(6)  评论(0)    收藏  举报