• 4.15作业


    作业:

    (不会写,看能不能抄明白.....

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

    class Metaclass(type):
        def __new__(cls, class_name,bases_class_name,attribute_dict):
            update_dict={}
            for k,v in attribute_dict.items():
                if not callable(v) and not k.startswith('__'):
                    update_dict[k.upper()]=v
                else:
                    update_dict[k]=v
            return type.__new__(cls,class_name,bases_class_name,update_dict)
    
    class Teacher(metaclass=Metaclass):
        hobby="Say you're the worst student I've ever brought"
        dream='Engineer of human soul'
        def say_job(self):
            print(f'my job is {self.name}')
    
    print(Teacher.__dict__)
    

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

    # 2.要求实例化时传参必须为关键字形式,否则抛出异常TypeError: must use keyword argument
    #
    # 3.key作为用户自定义类产生对象的属性,且所有属性变成大写
    # 3、在元类中控制自定义的类产生的对象相关的属性全部为隐藏属性
    
    class Metaclass(type):
        def __call__(self, *args, **kwargs):
            if args:
               raise TypeError('必须传入关键字参数')
            obj=object.__new__(self)
            for k,v in kwargs.items():
                obj.__dict__[k.upper()]=v
            return obj
    class Teacher(metaclass=Metaclass):
        hobby="Say you're the worst student I've ever brought"
        dream='Engineer of human soul'
        def say_job(self):
            pass
    
    p=Teacher(name='tom',age=18,sex='male')
    print(p.__dict__)
    # {'NAME': 'tom', 'AGE': 18, 'SEX': 'male'}
    

    3、在元类中控制自定义的类产生的对象相关的属性全部为隐藏属性

    class Metaclass(type):
        def __init__(self, class_name, bases_class_name, attribute_dict):
            super().__init__(class_name, bases_class_name, attribute_dict)
    
        def __call__(self, *args, **kwargs):
            obj = self.__new__(self)
            self.__init__(obj, *args, **kwargs)
            obj.__dict__ = {'_%s__%s' % (self.__name__, k): v for k, v in obj.__dict__.items()}
            return obj
    
    
    class Foo(object, metaclass=Metaclass):
        def __init__(self, name, age, gender):
            self.name = name
            self.age = age
            self.gender = gender
    
    
    obj = Foo('tom', 18, 'male')
    print(obj.__dict__)
    #{'_Foo__name': 'tom', '_Foo__age': 18, '_Foo__gender': 'male'}
    
  • 相关阅读:
    Android开发之记账本开发第四天
    动手动脑——继承与多态
    跟踪某个类所创建对象的个数
    动手动脑——类与对象
    石家庄地铁模拟
    动手动脑——方法
    查询单词出现次数
    动手动脑——JAVA语法基础
    原码反码补码
    ATM机模拟系统
  • 原文地址:https://www.cnblogs.com/zhangtieshan/p/12709611.html
Copyright © 2020-2023  润新知