Discuss / Python / 回来贴个注释版

回来贴个注释版

Topic source

Eliefly

#1 Created at ... [Delete] [Delete and Lock User]
# Filename: using_metaclass.py
# metaclass是类的模板,所以必须从`type`类型派生:
class ListMetaclass(type):
    def __new__(cls, name, bases, attrs):
        attrs['add'] = lambda self, value: self.append(value)
        print('1.', cls)
        print('2.', name)
        print('3.', bases)
        print('4.', attrs)
        # 1. <class '__main__.ListMetaclass'>
        # 2. MyList
        # 3. (<class 'list'>,)
        # 4. {'__module__': '__main__', 'add': <function ListMetaclass.__new__.<locals>.<lambda> at 0x00570030>, '__qualname__': 'MyList'}
        return type.__new__(cls, name, bases, attrs)
        # __new__()方法接收到的参数依次是:
        # 1、当前准备创建的类的对象,就像在普通的类方法中的self参数,即ListMetaclass元类,它是type类的对象,仍是类。
        # 2、类的名字,调用此元类最终创建出实例的类的名字,此处是Mylist,创建的实例是L。
        # 3、类继承的父类集合,调用此元类最终创建出实例的类的父类,Mylist的父类是list。
        # 4、类的方法集合,Mylist的方法集合。    
        # 当我们传入关键字参数metaclass时,魔术就生效了,它指示Python解释器在创建MyList时,
        # 要通过ListMetaclass.__new__()来创建,在此,我们可以修改类的定义,比如,加上新的
        # 方法,然后,返回修改后的定义。       
class MyList(list, metaclass=ListMetaclass):
    pass

# 验证:
# 测试一下MyList是否可以调用add()方法,普通的list没有add()方法  
L = MyList()
print(L)
L.add(1)
print(ListMetaclass)
print(MyList)
print(L)
# 结果:
[]
<class '__main__.ListMetaclass'>
<class '__main__.MyList'>
[1]

Eliefly

#2 Created at ... [Delete] [Delete and Lock User]

元类就是用来创建这些类(对象)的,元类就是类的类。type就是Python的内建元类,当然了,你也可以创建自己的元类。


  • 1

Reply