zoukankan      html  css  js  c++  java
  • day23元类、反射

    一、补充

    isinstance 检查是否obj、是否是类 cls 的对象

    issubclass检查sub类是否是 super 类的派生类

     

    二、反射弧

    通过字符串来操作类与对象的属性,这种操作称为反射

    hasatter  判断object中有没有一个name字符串对应的方法或属性

    getatter 获取obj中有没有一个name 字符串如果没有的话就返回一个 none

    setatter给 obj 中的一个属性添加一个值

    delatter删除obj中的一个属性

    class People:

      def __init__(self,name,age):

        self.name=name

        self.age=age

    obj=People('aa',10)

    print(hasatter(People,'name'))

    print(getattr(obj,'name'))

    setatter(People,'name','bb')

    print(People.__dict__)

    print(People,'age')

    print(obj.__dict__)

    输入运行命令执行该命令

    class Foo:

      def run(self):

        while True:

          cmd=input('cmd>>:').strip()

          if hasattr(self,cmd):

            func=getattr(self,cmd)

            func()

       def download(slelf):

        print('download.....')

       def upload(self):

        print('upload...')

    obj=Foo()

    obj.run()


     

    三、__str__

    class People:

      def __init__(self,name,age,sex):

        self.name=name

        self.age=age

        self.sex=sex

      def __str__(self):

        return(‘名字:%s 年龄:%s 性别:%s’)%(self.name,self.age,self.sex)

    obj=People('egon',18,'male')

    print(obj)

    四、__del__

    import time

    class People:

      def __init__(self,name,age,sex):

        self.name=name

        self.age=age

        self.sex=sex

      def __del__(self):#在对象被删除的条件下,自动执行

        print('__del__')

    obj=People('egon',18,'male')

    del obj

    time.sleep(5)


    五、元类

    1、exce用法

    code='''

    x=1

    y=2

    def f1(self,a,b):

      pass

    '''

    local_dic={}

    exec(code,{},local_dic)

    一切皆为对象:

    chinese=type(...)

    class chinese:

      country='china'

      def __init__(self,name,age,sex):

        self.name=name

        self.age=age

        self.sex=sex

       def speak(self):

        print('%s speak chinese'%self.name)

    print(chinese)

    p=chinese('egon',18,'male')

    print(type(p))

    元类:类的类就是元类,

    我们用class 定义的类使用来产生我们自己的对象的

    1、内置元类type是用来专门产生class定义的类的

    2、用内置的元类type,来实例化得到我们的类

    class_name='chinese'

    class_bases=(object,)

    class_body='''

    country='China'

    def __init__(self,name,age,sex)

      self.name=name

      self.age=age

      self.sex=sex

    def speak(self):

      print('%s speak Chinese'%self.name)

    '''

    class_dic={}

    exec(class_body,{},class_dic)

    类的三大要素,类名,空对象,类体

    print(class_name,class_bases,class_dic)

    Chinese=type(class_name,class_bases,class_dic)

    3、储备知识__call__

    class Foo:

      def __init__(self):

        pass

      def __str__(self):

        return'123'

      def __del__(self):

        pass

    调用对象,则会自动触发对象下的绑定方法__call__的执行,

    然后将对象本身当作第一个参数传给self,将调用对象括号内的值

    传给*args**kwargs

      def __del__(self):

        pass

    obj=Foo()

    print(obj)

    4、自定义元类:

    class Mymeta(type):

      #来控制类Foo的创建

      def __init__(self,class_name,class_bases,class_dic):

        if not class_name.istitle():

          raise TypeError('类名的首字母必须大写')

        if not class_dic.get('__doc__'):

          raise TypeError('类中必须写好文档注释')

        super(Mymeta,self).__init__(class_name,class_bases,class_dic)

      #控制类Foo的调用过程,即控制实例化Foo的过程

      def__call__(self,*args,**kwargs):#self=Foo,args=(111,)kwargs={}

       1、造一个空对象

        obj=object.__new__(self)

       2、调用Foo.__init__,将连同调用Foo括号内的参数一同传给__init__

        self.__init__(obj,*args,**kwargs)

        return obj

       #Foo=Mymeta('Foo',(object),class_dic)

        class Foo(object,metaclass=Mymeta):

        '''

        文档注释

        ‘’‘

        x=1

        def __init__(self,y):

           self.Y=y

        def f1(self):

          print('from f1')

    obj=Foo(111)


     

    #单例模式

    import settings

    class MySQL:

      _instance=None

      def __init__(self,ip,port):

        self.ip=ip

        self.port=port

      @classmethod

       def singleto(cls):

        if not cls._instance:

          obj=cls(settings.IP,settings.PORT)

          cls._instance=obj

        return cls._instance

    obj4=MySQL.singleton()

    obj5=MySQL.singleton()

     

  • 相关阅读:
    iText + Freemarker实现pdf的导出,支持中文、css以及图片,页眉页脚,页眉添加图片
    SpringBoot使用拦截器、过滤器、监听器
    Java中boolean类型占用多少个字节?我说一个,面试官让我回家等通知
    【搞定面试官】try中有return,finally还会执行吗?
    细说JVM内存模型
    easyExcel简介#
    gbdt和xgboost api
    RNN BPTT
    tensorflow LSTM
    [转]python与numpy基础
  • 原文地址:https://www.cnblogs.com/lg04551/p/8865838.html
Copyright © 2011-2022 走看看