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)
    
  • 相关阅读:
    Fuzzy CMeans Clustering【转】
    [转] 如何下载Google Earth中的卫星影像
    LINUX 上 ENVI 4.7 安装步骤,IDL 调用方式
    DISPLAY connection problem when using ENVI/IDL in X Terminal
    Gfarm 安装(已测试)
    【转】Envi调用MODIS Reprojection Tool(MRT)对MODIS产品进行批处理拼接、重投影、裁切
    vue环境搭建
    关于SVN问题Previous operation has not finished; run 'cleanup' if it was interrupted的解决方案
    Kettle入门安装
    projectwaiting in line
  • 原文地址:https://www.cnblogs.com/aden668/p/11453775.html
Copyright © 2011-2022 走看看