python 反射

Posted on 2019-11-20 13:00  S-skill  阅读(203)  评论(0编辑  收藏  举报
一. 什么是反射?
反射: 用字符串数据类型的变量名来访问这个变量的值
反射的方法: getattr,hasattr,setattr,delattr
反射可以用在: " 类, 对象, 模块, 反射自己模块中的内容"
hasattr(判断要么是True, 要么是False),
getattr # 根据字符串的形式,去对象中找成员。
hasattr # 根据字符串的形式,去判断对象中是否有成员。

类名.名字 相当于:
getattr(类名, "名字")
  对象名.名字
    hasattr(对象, "名字")

模块名.名字 相当于:
import 模块
getattr(模块, "名字")
自己文件.名字 相当于:
import sys
getattr(sys.modules["__main__"], "名字") == > 名字
修改
setattr(对象, 名字, 修改内容)
删除
delattr(对象, 名字)


1. getattr和hasattr的用法
class Reflex(object):
    reflex = '反射'
    def __init__(self,name):
        self.name = name

    def func(self):
        print('start func')
    @classmethod
    def login(cls):
        print('登录')

r = Reflex('电视')

# getattr反射查看属性
print(r.reflex)
print(r.name)
print(getattr(r,'reflex'))
print(getattr(Reflex,'reflex'))
print(getattr(r,'name'))

# getattr反射调用方法
getattr(Reflex,'func')(1)   # 反射要加括号,括号要传值,因为通过类经过反射调用的方法
getattr(Reflex,'login')()   # 因为是类方法,不需要对象,所以对象不需要传值

# hasattr判断是否有这个, 属性/方法
num = input(">>>")
if hasattr(Reflex,num): # 判断是否有这个, 属性/方法
    getattr(Reflex,num)(1)  # 执行这个有这个方法
    print(getattr(Reflex,num))    # 执行这个有这个属性
else:
    print('没有你输入的这个方法或者属性')

 

2. 修改文件名

import os
os.rename("__init__.py","init")     # 改变文件名字
getattr(os,"rename")("init","__init__.py")  # 把 文件 init 变成 __init__.py 文件
print(getattr(os,"rename"))

#  内置函数
rename = os.rename  # 赋值给rename
rename2 = getattr(os,"rename")  # 赋值给rename2
rename("__init__.py","init")
rename2("init","__init__.py")

# 补充
# os模块和shutil的比较
import os
import shutil   # 可以修改文件夹和文件名
# os在py2 + win中报错
os.rename('a.tst','b.tst')

# shutil在py2  和   py3都可以用
# 修改文件名
shutil.move('a.tst','b.tst')
# 可以删除文件夹
shutil.rmtree(r'D:\...\...\...')

 

3. sys.modules["__main__"]相当于把本文件当作一个模块去执行

import sys
# sys.modules["__main__"] == 当前模块
def func():
    print("in func")
def func2():
    print("in func2")
# 反射自己模块中的内容  找到自己当前文件所在的命名空间

modules = sys.modules['__main__']   # 当前模块,相当于把这个文件当做模块
modules.func()
modules.func2()
getattr(sys.modules['__main__'],'func')()   # 反射
getattr(sys.modules['__main__'],'func2')()
print(sys.modules["__main__"])      # 拿到内存地址

# import 都相当于导入一个模块
# 模块那个导入了, 那个没导入  在我的python解释器里应该记录下来.
# import sys  是一个模块, 这个模块里的所有的方法都是和python解释器相关的
print(sys.modules)  # '__main__': <module '__main__' from ......>

 

4. setattr和delattr的用法
class Reflex(object):
    reflex = '反射'
    def __init__(self,name):
        self.name = name

    def func(self):
        print('start func')
    @classmethod
    def login(cls):
        print('登录')

r = Reflex('电视')

# setattr修改,反射
setattr(Reflex,'reflex','不反射')
print(getattr(Reflex,'reflex'))
setattr(r,'name','电影')
print(getattr(r,'name'))

# delattr删除,反射
delattr(Reflex,'reflex')
# print(getattr(Reflex,'reflex'))   # 报错

 



















Copyright © 2024 S-skill
Powered by .NET 8.0 on Kubernetes