反射

反射是什么

使用字符串数据类型的变量名来获取这个比变量的值

为什么要用反射

三个反射应用场景

  1. input

    只能输入字符串类型,来获取字符串对应的变量名

  2. 文件

    从文件中读出的字符串,想转化成变量的名字

  3. 网络

    将网络传输的字符串转化成变量的名字

怎么用

hasattr

getattr

1.反射类 中的变量

class Foo:
    school = 'oldboy'
    country = 'china'
    language = 'chinese'
inp = input('>>>').strip()
print(geattr(Foo,inp))

geattr方法:

getattr(变量名:命名空间,字符串:属于一个命名空间内的变量名)

如何执行类中的方法:
class Foo:
    school = 'oldboy'
    country = 'china'
    language = 'chinese'
    @classmethod
    def stat(cls):
        print(cls.school)

2.反射对象中的变量

  • 对象属性
  • 普通方法

3.反射模块中的变量

import os#os就是一个模块
os.rename()
getattr(os,'rename')()

4.反射本文件中的变量

a=1
b=2
name = 'li'
def abc():
    print('abc')
import sys 
print(sys.modules['__main__'])#本文件的命名空间
print(sys.modules['__main__'].a)
print(__name__)#内置变量
print(sys.modules[__name__])#反射本文件中的变量,固定的使用这个命名空间
getattr(sys.modules[__name__],'abc')()

setattr

setattr(Foo,'school','dfsdf')#向某个作用域添加某一个变量,接受三个参数,命名空间,'变量名',变量值)

delattr

class Foo:
    country='Chine'
delattr(Foo,'country')

__ str __ __ repr __

不用调用这个方法就可以出发这个方法的执行

  class Foo:
        def __str__(self):
            return 'abcd'
        def __repr__(self):
            return 'dcba'
    obj = Foo()
    __str__ :
        print(obj)
        '%s'%obj
        str(obj)
    __repr__  : # 当使用会触发str方法的方式,但是Foo类内部又没有实现__str__方法的时候,都会调用__repr__
        '%r'%obj
        repr(obj)

你可能感兴趣的:(反射)