python元类编程

# python中一切都是对象
# 类也是一个对象,那么类是由谁生成的呢?由type生成

# 定义一个元类,必须继承type
class Mytype(type):

    def __call__(self, *args, **kwargs):
        pass


# 指定类由Mytype生成
class Satori(metaclass=Mytype):

    def __init__(self, name, age):
        self.name = name
        self.age = age

satori = Satori("satori", 18)
# 此时打印会有什么结果
# 此时Satori这个类不再由type生成,而是由我们指定的Mytype生成
# 当Satori加上括号时,本质上是执行元类的call方法,但是Mytype却并没有返回,所以打印的是一个None
print(satori)  # None

  

# python中一切都是对象
# 类也是一个对象,那么类是由谁生成的呢?由type生成

# 定义一个元类,必须继承type
class Mytype(type):

    def __call__(self, *args, **kwargs):
        obj = object.__new__(self)  # 这句话表示生成self的实例对象,而这里的self指的就是satori
        self.__init__(obj, *args, **kwargs)
        return obj


# 指定类由Mytype生成
class Satori(metaclass=Mytype):

    def __init__(self, name, age):
        self.name = name
        self.age = age

satori = Satori("satori", 18)
# 此时打印会有什么结果
# 此时Satori这个类不再由type生成,而是由我们指定的Mytype生成
# 当Satori加上括号时,本质上是执行元类的call方法,但是Mytype却并没有返回,所以打印的是一个None
# 所以要在call方法中返回Satori的实例对象
print(satori)  # <__main__.Satori object at 0x05A33990>
print(satori.__dict__)  # {'name': 'satori', 'age': 18}

  

猜你喜欢

转载自www.cnblogs.com/traditional/p/9284489.html
今日推荐