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()#这里直接写就可以,不用写参数
原文地址:https://www.cnblogs.com/wangkun122/p/7892448.html