元类作业

# 练习一:在元类中控制把自定义类的数据属性都变成大写

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

class Mymeta(type):

    def __new__(cls, name, bases, attrs):
        update_attrs = {}
        for k, v in attrs.items():
            if not callable(v) and not k.startswith('__'):
                update_attrs[k.upper()] = v
            else:
                update_attrs[k] = v
        return super().__new__(cls, name, bases, update_attrs)


class Foo(metaclass=Mymeta):
    name = 'zxc'
    def walk(self):
        print(f'{self.name} walk')

print(Foo.__dict__)



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

class Mymeta(type):
    def __call__(self, *args, **kwargs):
        if args:
            raise TypeError('must use keyword argument for key function')
        obj = object.__new__(self)

        for k, v in kwargs.items():
            obj.__dict__[k.upper()] = v
        return obj

class Foo(metaclass=Mymeta):
    name = 'zxc'
    def walk(self):
        print(f'{self.name} walk')

p=Foo(name='lilin',age=18,sex='male')
print(p.__dict__)


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

class Mymeta(type):

    # def __init__(self, class_name, class_bases, class_dic):
    #     # 控制类Foo的创建
    #     super().__init__(class_name, class_bases, class_dic)

    def __call__(self, *args, **kwargs):
        obj = self.__new__(self)
        self.__init__(obj, *args, **kwargs)
        obj.__dict__ = {f'_{self.__name__}__{k}':v for k,v in obj.__dict__.items()}
        return obj

class Foo(object, metaclass=Mymeta):
    def __init__(self, name, age):
        self.name = name
        self.age = age

obj = Foo('zxc', '23')
print(obj.__dict__)


# 4、基于元类实现单例模式
class Mymeta(type):
    def __init__(self,name,bases,dic):
        self.__instance = object.__new__(self)
        self.__init__(self.__instance, '3.1.1.1',2224)
        super().__init__(name,bases,dic)

    def __call__(self, *args, **kwargs):
        if args or kwargs:
            obj=object.__new__(self)
            self.__init__(obj,*args,**kwargs)
            return obj
        return self.__instance

class Mysql(metaclass=Mymeta):
    def __init__(self,host,port):
        self.host=host
        self.port=port

obj1=Mysql()
obj2=Mysql()
print(obj1 is obj2 is obj2)
obj4=Mysql('3.1.1.1',2224)

  

posted @ 2020-04-15 22:07  清轩挽长风  阅读(104)  评论(0编辑  收藏  举报