Python元类

本节介绍一下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__)

 

posted @ 2020-03-25 23:08  白加黑呀  阅读(353)  评论(0编辑  收藏  举报