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('xxxxx')
        
    p = Person('nick')#自动触发init的执行
    #先触发元类的__call__
    p()
    
    #__new__
    object
    
    #给我把对象中的所有属性都设置成私有的
    
    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.__nwe__(self)
         #调用__init__方法完成初始化
         #类来调用__init__方法,就是个普通函数,有几个参数就传几个参数
         #self.__init__(obj,args,kwargs)
         #对象来调用__init__方法,对象的绑定方法,会把自身传过来
         obj.__init__(*args,**kwargs) 
          print(obj)
          reutnr 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)
        #print(obj.__dict__)
        obj.__dict__={}
    
  • 相关阅读:
    C++ 引用详解
    QT的UDP组播技术
    idea快捷键
    window10安装不同版本的mysql(5.7和8.0.25)
    第2篇scrum
    结对项目:四则运算(C语言)
    个人项目wc(C语言)
    修改博客园背景,css
    第一次作业
    第4篇 Scrum 冲刺博客(专✌️团队)
  • 原文地址:https://www.cnblogs.com/luodaoqi/p/11528871.html
Copyright © 2011-2022 走看看