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'}

猜你喜欢

转载自www.cnblogs.com/zhangtieshan/p/12709611.html