本节介绍一下 Python 中元类的基本内容
type :python3 中所有的类都是通过 type 创建出来的
object : 所有类的顶级父类
想说的话在注释中都添加了, 想学习的可以看一下
- # 元类 python 中内置的元类: type
- # 元组如果只有一个参数需要在参数后面增加一个逗号, 不然是错误的. 空元组 ()
- # type 创建类需要三个参数, 第一个类名字符串类型 第二个要继承的类是一个元组,
- # 第三个是属性及方法是一个字典 键值对的形式表示属性或者对应的方法
- T = type('小明', (object,), {'attr': 100, '__attr2': 200}) # 会返回一个类
- # 类名 要继承的类 类的属性和方法
- print(T)
- class T1(object):
- attr = 100
- __attr2 = 200
- print(T1)
- # 定义的类是相同的
- print(T.__dict__) # 查看类所拥有的属性
- def func(self):
- print('----------- 这个是 self')
- T3 = type('小明 2', (object,), {'function': func}) # 传入方法创建类
- print(T3)
- T3().function()
- # 自定义元类 必须继承 type
- # type 创建类需要三个参数
- class MyClass(type):
- # 重写 new 方法
- def __new__(cls, name, bases, attr_dict, *args, **kwargs):
- print('最基础的自定义元类')
- # return type.__new__(name, bases, attr_dict)
- return super().__new__(cls, name, bases, attr_dict)
- # metaclass 用来指定元类 如果不传默认是 type 使用自定义的元类创建的类
- class One(metaclass=MyClass):
- name = '小明'
- print(type(One))
- print(One.name)
- # 从继承的父类里面找有没有指定元类, 如果找到了子类就用父类指定的元类来创建类
- class Two(One):
- pass
- print(type(Two))
- # 定义一个类, 通过元类来让该类的类属性变成大写
- class MyClassTow(type):
- def __new__(cls, name, bases, attr_dict, *args, **kwargs):
- # 遍历属性名称, 遍历字典的键值对用 items
- for k, v in attr_dict.items():
- attr_dict.pop(k)
- # 删除 key
- attr_dict[k.upper()] = v
- # 将 key 转为大写
- # attr_dict['__slots__'] = ['name', 'age', 'gender']
- # 限制通过这个元类创建的类的实例对象的属性
- return super().__new__(cls, name, bases, attr_dict)
- class Three(metaclass=MyClassTow):
- name = '小明'
- age = 18
- gender = '男'
- print(Three.__dict__)
来源: http://www.bubuko.com/infodetail-3477847.html