zoukankan      html  css  js  c++  java
  • 21 isinstance issubclass 反射 _str_ _new_ _len_ _call_

    主要内容:

    1.  isinstance   判断对象所属类型,包括继承关系

    class A:pass
    class B(A):pass
    b = B()
    print(isinstance(b,B)) #ture
    print(isinstance(b,A)) #o,t
    

      注意:type()    只管本层,不包含继承关系

    class mystr(str):pass
    ms = mystr('alex')
    print(ms)
    print(type(ms) is str)  # 不包含继承关系,只管一层
    print(isinstance('alex',str)) # 包含所有的继承关系
    

    2.  issubclass  判断类与类的关系.

    class A:pass
    class B(A):pass
    print(issubclass(B,A))    #ture 判断类与类之间的关系.
    

    3. 反射 :     用字符串类型的变量名来访问这个变量的值.

      反射的方法:  getattr    :  获取属性

            hasattr  :  检测是否含有某属性

            setattr  :  设置属性

            delattr  :  删除属性

      1) : getttr  和 hasattr

       a :   类名:静态属性,类方法,静态方法

    class A:
        name = 'alex'
        @classmethod
        def func(cls):
            print('fnc...')
        @staticmethod
        def fn():
            print('fn...')
    反射查看属性 print(A.name) print(getattr(A,'name')) #访问静态属性
    反射调用方法 getattr(A,'func')() #访问类方法 getattr(A,'fn')() #访问静态方法 #hasattr : 检测是否含有某属性 print(hasattr(A,'name')) #检测是否含有某属性 print(hasattr(A,'func')) #返回ture
    # 反射调用方法更加安全.
    num = input('>>>')
    if hasattr(A,num):
        getattr(A,num)()
    

      b : 对象 : 方法,静态属性

    class A:
        name = 'alex'
        @classmethod
        def func(cls):
            print('fnc...')
        @staticmethod
        def fn():
            print('fn...')
    a = A()
    print(getattr(a,'name'))
    getattr(a,'func')()
    getattr(a,'fn')()
    

      c : 模块名 . 名字

        格式 : import  模块

           getattr(模块,'名字')

    import  os
    os .rename('lianxi.py','练习1.py')
    getattr(os,'rename')('练习1.py','lianxi.py')
    

      d : 自己文件 . 名字

        格式 : import sys

            getattr (sys.modules[__main__],  '名字')

    反射自己模块中的内容,找到自己当前文件所在的命名空间
    def wahaha():
        print('wahaha')
    def qqxing():
        print('qqxing')
    # import   importx相当于导入了一个模块,模块导入与否,在pyhon解释器中都会记录下来
    import sys                           #是一个模块,这个模块的所有方法都是和python解释器相关的
    print(sys.modules)                   #这个方法 表示所有在当前这个python程序中导入的模块
    # '__main__': <module '__main__' from 'C:/Users/26897/PycharmProjects/untitled/Workspace/day 21 反射/练习.py'>
    print(sys.modules['__main__'])     #找到自己当前所在的命名空间
    myfile = sys.modules['__main__']
    myfile.wahaha()
    getattr(myfile,'wahaha')()
    myfile.qqxing()
    getattr(myfile,'qqxing')()
    

      2)   setattr   和 delattr  

    class A:
        name = 'alex'
        @classmethod
        def func(cls):
            print('fnc...')
        @staticmethod
        def fn():
            print('fn...')
    setattr(A,'name','sb')
    print(A.__dict__)
    delattr(A,'name')
    print(A.__dict__)
    

      补充:   枚举

    # 枚举  : 索引 每一项内容,后面的数字是索引从几开始
    l = ['a','b','c']
    for num,i in enumerate(l,1):
        print(num,i)
    # 结果
    # 1 a
    # 2 b
    # 3 c
    

     4.  __call __ 方法  :  对象()相当于调用__call__方法

    class A:
        def __call__(self, *args, **kwargs):
            print('执行__call方法了')
        def call(self):
            print('执行call方法了')
    a = A()
    a()        #对象()    相当于执行__call__方法
    A()()      #相当于先实例化一个对象,然后对象(),相当于调用__call__方法
    # 执行__call方法了
    

      

    class A:
        def __call__(self, *args, **kwargs):
            print('执行__call方法了')
        def call(self):
            print('执行call方法了')
    class B:
        def __init__(self,cls): 
            print('在实例化A之前做一些事情')
            self.a = cls()    #对A进行实例化, selfa 相当于一个对象
            self.a()          #对象()   执行__call__方法
            print('在实例化A之后做一些事情')
    A()() # 类名()() ,相当于先实例化得到一个对象,再对对象(),==>和上面的结果一样,相当于调用__call__方法
    B(A)
    

     5. __len__  :内置函数和内置方法是有关系的.   len(obj)相当于调用了__len__方法

    class mylist:
        def __init__(self):
            self.lst = [1,2,3,4,5,6]
            self.name = 'alex'
            self.age = 83
        def __len__(self):
            print('执行__len__了')
            return len(self.__dict__)
    
    l = mylist()        #{'lst': [1, 2, 3, 4, 5, 6], 'name': 'alex', 'age': 83}
    print(l.__dict__)
    print(len(l))
    # len(obj)相当于调用了这个obj的__len__方法
    # __len__方法return的值就是len函数的返回值
    # 如果一个obj对象没有__len__方法,那么len函数会报错
    

      计算字符串的长度

    class Lis:
        def __init__(self,s):
            self.s = s
        def __len__(self):
            return len(self.s)
    l = Lis('aaaaa')
    print(l.__dict__)
    print(len(l))
    

    6 .  __new__      构造方法         (__init__初始化方法)

      新式类,开始实例化时,__new方法会返回当前类的实例,然后该类的__init方法,接收这个实例self,

    class Single:
        def __new__(cls, *args, **kwargs):
            obj = object.__new__(cls)
            print('在new方法里',obj)
            return obj
        def __init__(self):
            print('在init方法里',self)
    obj = Single()
    single的new,single没有,只能调用object的new方法
    new方法在什么时候执行???
        在实例化之后,__init__之前先执行new来创建一块空间
    

      单例类:如果一个类,从头到尾只有一个实例,说明从头到尾只开辟了一块属于对象的空间,那么这个类就是单例类.

    class Single:
        __isinstance = None
        def __new__(cls, *args, **kwargs):
            if not cls.__isinstance:
                cls.__isinstance = object.__new__(cls)
            return cls.__isinstance
        def __init__(self):pass
    s1 = Single()
    s2 = Single()
    s3 = Single()
    print(s1,s2,s3)
    

    7.  __str__

      print一个对象相当于调用一个对象的__str__方法

      str(obj),相当于执行obj.__str__方法

      '%s'%obj,相当于执行obj.__str__方法

    class Student:
        def __str__(self):
            return '%s %s %s'%(self.school,self.cls,self.name)
    
        def __init__(self,name,stu_cls):
            self.school = 'oldboy'
            self.name = name
            self.cls = stu_cls
    
    he = Student('hezewei','py14')
    print(he)
    print(str(he))   # 内置的数据类型,内置的类,相当于执行__str__
    print('学生1 : %s'%he)
    

      

     

     

  • 相关阅读:
    在rhel上配置yum 源
    python2.7 使用生成器方式实现斐波那契数列
    Web 应用程序测试思考
    python2.7 可迭代对象、迭代器和迭代的概念说明
    python2.7 zipfile 的简单用法
    python函数定义中的参数说明
    python 内置函数filter、map、reduce的使用说明
    python虚拟环境迁移
    python yaml 文件解析及str、repr函数的说明
    python xlrd、xlwt、xlutils操作excel文件
  • 原文地址:https://www.cnblogs.com/gyh412724/p/9394607.html
Copyright © 2011-2022 走看看