yamx

元类练习二

# 3、在元类中控制自定义的类无需__init__方法

# 1.元类帮其完成创建对象,以及初始化操作;

# 2.要求实例化时传参必须为关键字形式,否则抛出异常TypeError: must use keyword argument

# 3.key作为用户自定义类产生对象的属性,且所有属性变成大写

class Mymeta3(type):

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

        # *args接收位置参数

        # **kwargs接收关键字参数

        # 通过判断这两个可变长的参数是否有值,即可判断是否通过关键字传参


        if not kwargs or args:

            # 关键字参数为空或位置参数元组有值,抛出异常

            raise TypeError('must use keyword argument')

        print(args)

        print(kwargs)

        # 调用new生成空对象

        obj = self.__new__(self)


        # 调用init初始化对象

        self.__init__(obj)


        print('将key全部变成大写之前:', obj.__dict__)

        # key作为用户自定义类产生对象的属性,且所有属性变成大写

        for key, value in kwargs.items():

            # key不是全大写,将key大写化加入字典

            if not key.isupper():

                upper_key = key.upper()

                obj.__dict__[upper_key] = value

            # key全大写,直接加入字典

            else:

                obj.__dict__[key] = value


        print('将key全部变成大写后:', obj.__dict__)

        return obj


class Foo(metaclass=Mymeta3):

    pass


obj = Foo(name='admin', AGe=18, GENDER='male')

print(obj.__dict__)


# 输出内容:

# ()

# {'name': 'admin', 'AGe': 18, 'GENDER': 'male'}

# 将key全部变成大写之前: {}

# 将key全部变成大写后: {'NAME': 'admin', 'AGE': 18, 'GENDER': 'male'}

# {'NAME': 'admin', 'AGE': 18, 'GENDER': 'male'}


评论

© yamx | Powered by LOFTER