zoukankan      html  css  js  c++  java
  • day28 python学习反射 sinstance和issubclass

     

    isinstance和issubclass

    isinstance(obj,cls)检查是否obj是否是类 cls 的对象

    判断这个对象是不是这个类,或者是不是这个类的子类的实例化

    class Foo(object):
         pass
      
    obj = Foo()
      
    isinstance(obj, Foo)

    issubclass(sub, super)检查sub类是否是 super 类的子类(派生类 )

    复制代码
    class Foo(object):
        pass
     
    class Bar(Foo):
        pass
     
    issubclass(Bar, Foo)
    复制代码

     vars()  与 dir()  相似

    c='c0'
    d='d1'
    print(vars())#查看这个空间中的方法名和方法的数据(以建键值对的方式存在),以键值对的方式体现出来
    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000058C6B677F0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/py/day28/test.py', '__cached__': None, 'c': 'c0', 'd': 'd1'}
    
    print(dir())#查看方法
    ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'c', 'd']

    __doc__ :   它后边的信息就是注释信息(注释信息不能写错,以免误导人)

    class A:
        def func(self,a, b):#当我在下边加三队"""下边会自动联想出来需要加注释的内容,你可以对他进行注释
            """
    
            :param a: 这里会自动跳出让加注释的内容,点
            :param b:
            :return:
    
            """
    b=A
    print(vars(A))  #查看类A中的方法,
    可以看到打印出的内容有  '__doc__': '类管理员', 

    反射

    1 什么是反射

    反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。

    2 python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

    四个可以实现自省的函数

    下列方法适用于类和对象(一切皆对象,类本身也是一个对象)

    class Maneger:
        def __init__(self,name,phone):
            self.name=name
            self.phone=phone
        def make_techer(self):
            print('增加了一条老师信息')
    xiaoyu=Maneger('小雨',1854521)
    a=getattr(xiaoyu,'phone')  #通过给一个字符串类型的变量名,获得他的静态属性值
    print(a)
    b=getattr(xiaoyu,'make_techer')
    b()  #通过给一个字符串类型的变量名,调用他的方法
    # c=getattr(Maneger,'make_techer')
    # c()
    if  hasattr(xiaoyu,'age'):
        e=getattr(xiaoyu,'age')
        print(a)
    # else:
    #     print('没有这个属性')
    # setattr(Maneger,'Country','CHINA')  #通过字符串类的属性名,对应属性来添加属性
    # print(Maneger.Country)
    # setattr(xiaoyu,'Country','meiguo')#  通过字符串类的来增加他得属性民和方法
    # print(xiaoyu.Country)
    # # delattr(Maneger,'Country')
    

    # hasattr(对象名,'属性名') 返回True或False
    #属性值 = getattr(对象名,'属性名')
    #方法的内存地址 = getattr(对象名,'方法名')
    #方法的内存地址()

    class A:
        role='1'
        def func(self):
            lis=[]
            a=input('aa')
            lis.append(a)
            return lis
    a=getattr(A,'func')  #当直接对类中的方法反射时,因为里边有一个self,
    # 所以在a()中随意写一个内容就可以让他执行了 因为函数哪里需要有参数传过去,
    # 但是不会在内部使用
    # func() missing 1 required positional argument: 'self'
    a('q1')
    
    class B:
        role='1'
        @staticmethod  #或者写成这种类静态方法的形式就可以不用写self 这个参数
        def func():
            lis=[]
            a=input('aa')
            lis.append(a)
            return lis
    a=getattr(B,'func')
    a()#这里直接写就可以,不用写参数
  • 相关阅读:
    javaweb学习总结(二十九)——EL表达式
    javaweb学习总结(二十)——JavaBean总结
    Js_闭包详解
    JDBC各种数据库连接URL关键代码
    Jquery Table 的基本操作
    浅谈HTTP中Get与Post的区别
    hibernate一级缓存和二级缓存的区别
    SQL删除重复数据只保留一条
    数据库事务的隔离级别
    完全卸载oracle11g
  • 原文地址:https://www.cnblogs.com/wangkun122/p/7892448.html
Copyright © 2011-2022 走看看