Python学习笔记-Day21-反射、__str__、__repr__

内容大纲

一、反射(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
原文地址:https://www.cnblogs.com/tian-tian/p/9569403.html