zoukankan      html  css  js  c++  java
  • 通过元类控制类的调用过程

    通过元类控制类的调用过程

    #__call__
    #控制类的调用过程,实际在控制:对象的产生
    class Mymeta(type):
        def __call__(self, *args, **kwargs):
            # print('xxx')
            return 1
    class Person(object,metaclass=Mymeta):
        school='oldboy'
        def __init__(self,name):
            self.name=name
        def score(self):
            print('分数是100')
    p=Person('nick')
    print(p.name)
    
    class Person():
        school='oldboy'
        def __init__(self,name):
            self.name=name
        def score(self):
            print('分数是100')
        def __call__(self, *args, **kwargs):
            print('xxxx')
    
    p=Person('nick')   #自动触发init的执行
    #先触发元类的__call__
    p()
    
    

    __new__

    练习:把对象中所有属性都设置成私有的

    分析
    # class Mymeta(type):
    #     def __call__(self, *args, **kwargs):
    #         #self 是Person这个类
    #         # print(args)
    #         # print(kwargs)
    #         # return self(*args)  #这里不行,会递归
    #         # self.__new__(self)
    #         #实例化产生一个Person类的对象,借助__new__来产生,需要把类传过去,才能产生对象
    #         #obj 是Person类的对象,只不过是空的
    #         obj=object.__new__(self)
    #         # obj=self.__new__(self)
    #         #调用__init__方法完成初始化
    #         #类来调用__init__方法,就是个普通函数,有几个参数就穿几个惨
    #         # self.__init__(obj,*args, **kwargs)
    #         #对象来调用__init__方法,对象的绑定方法,会把自身穿过来
    #         obj.__init__(*args, **kwargs)
    #         print(obj)
    #         return obj
    #
    #
    # class Person(object, metaclass=Mymeta):
    #     school = 'oldboy'
    #     def __init__(self, name):
    #         self.name = name
    #     def score(self):
    #         print('分数是100')
    # p = Person(name='nick')
    # print(p)
    # print(p.name)
    
    
    #把对象所有的属性变成私有
    class Mymeta(type):
        def __call__(self, *args, **kwargs):
            obj=object.__new__(self)
            obj.__init__(*args,**kwargs)
            obj.__dict__ = {'_%s__%s' % (self.__name__, k): v for k, v in obj.__dict__.items()}
            return obj
    
    class Person(object,metaclass=Mymeta):
        school='oldboy'
        def __init__(self,name):
            self.name=name
        def score(self):
            print('分数是100')
    p=Person(name='nick')
    print(p.__dict__)
    print(p.name)
    
  • 相关阅读:
    C#时间差
    centos8安装ffmpeg
    CentOS8同步时间
    安装Supervisor
    ajax 传递 token
    .net core 3.1 中 的跨域设置
    jaeger 本地编译
    Kubernates 环境搭建
    linux : find
    Linux: 文件分割和合并
  • 原文地址:https://www.cnblogs.com/aden668/p/11453775.html
Copyright © 2011-2022 走看看