内容大纲
一、反射(getattr、hasattr、setattr、delattr)
二、__str__和__repr__
一、反射
1、什么是反射:反射式通过字符串类型的变量名来获取变量的值
2、为什么使用反射:input输入的都是字符串类型,文件读取的都是字符串类型、网络传输的都是字符串类型
3、方法解析:
① getattr:getattr(变量的空间名,字符串类型的变量名),# 相当于变量的空间名.变量名,即对象名.属性。变量名可以是属性也可以是方法,如果要执行方法的话,在后面加上()。
② hasattr:用来判断该命名空间中是否有这个变量名,hasattr(变量的空间名,字符串类型的变量名)。
③ setattr:用来改变变量的值,有三个参数,setattr(变量的空间,变量名,更改后的变量名),通常方法不会被改变
④ delattr:用来删除变量,delattr(变量的空间,字符串类型的变量名)
4、反射的用处:
① 反射类中的变量:静态属性、类方法、静态方法
class Foo: school = 'oldboy' country = 'China' language = 'Chinese' @classmethod def class_method(cls): print(cls.school) @staticmethod def static_method(): print('instatic_method') def wahaha(self): print('wahahah') # 没有反射前:需要每个都进行判断 # inp=input('>>>') # ifinp=='school': # print(Foo.school) # ifinp=='country': # print(Foo.country) # 有反射后:不需要每个都判断,直接执行就行 while True: inp = input('>>>') if hasattr(Foo, inp): print(getattr(Foo, inp)) getattr(Foo, 'school') # 相当于Foo.school 反射类中的属性 getattr(Foo, 'class_method')() # 相当于Foo.class_method() 反射类中的类方法 getattr(Foo, 'static_method') # 相当于Foo.static_method() 反射类中的静态方法 print(hasattr(Foo, 'wahaha')) # True
② 反射对象中的变量:属性,普通方法
class Foo: def __init__(self, name, age): self.name = name self.age = age def eating(self): print('%siseating' % self.name) ming = Foo('xiaoming', 23) getattr(ming, 'eating')() # xiaomingiseating普通方法 print(getattr(ming, 'name')) # 对象属性
③ 反射模块中的变量:
import os # os就是一个模块 os.rename('123', '123.bak') getattr(os, 'rename')('123.bak', '123')
④ 反射本文件中的变量:import sys
空间名是 sys.modules['__main__'] 或sys.modules[__name__]
a = 1 b = 2 def file_func(): print('infunc') import sys print(sys.modules['__main__']) # sys.module['__main__']是本文件的命名空间 print(sys.modules['__main__'].a) # 打印出1 sys.modules['__main__'].file_func() # infunc getattr(sys.modules[__name__], 'file_func')() # infunc