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()

     

  • 相关阅读:
    如释重负(纪——写完作业论文)
    安装sql2005中文版时提示系统配置检查器失败,消息为“性能监视器计数器检查失败”
    Get ConnectString Form Web.config
    如何在ASP.NET中实现防盗链[转]
    Authentication and Authorization
    上传大步的自唱Music,绝对好听!
    "某个程序安装已在安装计算机上创建挂起的文件操作" 解决办法
    WebM给我们带来什么?H.264又给我们带来什么?Google不支持H.264对未来会产生怎样的影响? 人工智能
    机器学习初探 人工智能
    函数式编程学习之路(九) 人工智能
  • 原文地址:https://www.cnblogs.com/lg04551/p/8865838.html
Copyright © 2011-2022 走看看