yamx

元类练习一

# 1、在元类中控制把自定义类的数据属性都变成大写

class Mymeta1(type):

    def __new__(cls, name, bases, attrs):

        print(attrs)

        update_attrs_dict = {}

        for key, value in attrs.items():

            if not callable(value) and not key.startswith('__') and not key.isupper():

                upper_key = key.upper()

                update_attrs_dict[upper_key] = value

            else:

                update_attrs_dict[key] = value

        return type.__new__(cls, name, bases, update_attrs_dict)



class People(metaclass=Mymeta1):

    name = '111'

    age = 18


    def foo(self):

        pass



print(People.__dict__)



# 输出内容:

# {'__module__': '__main__', '__qualname__': 'People', 'name': '111', 'age': 18, 'foo': <function People.foo at 0x0000023DE14F5598>}

# {'__module__': '__main__', 'NAME': '111', 'AGE': 18, 'foo': <function People.foo at 0x0000023DE14F5598>, '__dict__': <attribute '__dict__' of 'People' objects>, ......}


# 2、 控制自定义类生成的对象中数据属性都变成大写

# 调用类产生对象的三个过程:

# 一个对象能被调用,说明该对象或该类的元类中有__call__

# 1、调用时会执行__call__

# 2、然后依次执行__new__方法(优先执行改写过得new方法,如果没有就执行object的new方法),生成空对象

# 3、接着执行__init__方法(优先执行改写过的init方法,如果没有就执行object的init方法),完成对象初始化

# 4、最后返回该对象

class Mymeta2(type):

    # 1

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

        # 2

        obj = self.__new__(self)

        # 3

        self.__init__(obj, *args, **kwargs)

        # -------------定制化过程---------

        print('修改前:', obj.__dict__)

        updated_dict = {}

        for key, value in obj.__dict__.items():

            if not key.isupper():

                updated_key = key.upper()

                updated_dict[updated_key] = value

        obj.__dict__ = updated_dict

        print('修改后:', obj.__dict__)

        # ------------------------------

        # 4

        return obj



class Animal(metaclass=Mymeta2):

    def __init__(self, name, gender):

        self.name = name

        self.gender = gender


    def say(self):

        print('动物的叫声')



obj = Animal('cat', 'male')

print(obj.__dict__)


# 输出内容:

# 修改前: {'name': 'cat', 'gender': 'male'}

# 修改后: {'NAME': 'cat', 'GENDER': 'male'}

# {'NAME': 'cat', 'GENDER': 'male'}


评论

© yamx | Powered by LOFTER