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)
    
  • 相关阅读:
    javascript 离开网页时 触发函数
    dhl:简单的WebConfig加密 连接字符加密解密
    javascript获取网页URL地址及参数等
    dhl:img 的src 在 ie7下是将全路径。>ie8和firefox没有问题
    有趣有用网址大全
    VS2010 项目引用了DLL文件,也写了Using,但是编译时提示:未能找到类型或命名空间名称
    iis6配置支持.net4.0
    闲语MVC3和Razor 转自:啊不
    dhl:4.0服务器端控件
    如何在C#中实现窗体全屏模式
  • 原文地址:https://www.cnblogs.com/aden668/p/11453775.html
Copyright © 2011-2022 走看看