关于在相同或者不同python文件夹下利用反射

关于在相同或者不同python文件夹下利用反射

问题1:如何反射,获取在一个 文件夹 下指定对象的属性,方法等

答:举个例子,直接看代码

'''
如何反射,获取在一个  文件夹  下指定对象的属性,方法等
'''
print(__name__)#__main__ 代表模块本身,self
#这里的__name__就代表当前文件的名称!!

if __name__=="__main__":  #该if判断语句只会在被别的模块导入的时候发挥作用,被模块导入时就不会被执行,只有在当前python文件下才发挥作用!!
    print('hahahhaha')
'''
__name__在当前模块主动执行情况下(不是被导入执行),等价于__main__就表示说是在当前文件下执行,而不是说是另外写一个python文件下执行
        在被其他模块导入执行情况下,__name__就等价于模块名,模块名就是说是__name__存在下的文件的名称
'''
class Person:
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def walk(self):
        print('%s赶紧走!!'%self.name)

def show(self):
    print('%s在展示自己的风采!!'%self.name)
def show1(self):
    print('%s在展示自己的风采!!'%self.name)
p1=Person('小李',11)
#字符串获取对象中的实例属性
a=getattr(p1,'name')
#print(a)

def say_hi():
    print('1111')

import sys
#for k,v in sys.modules.items():
#    print(k,v)
#__main__ <module '__main__' from 'C:\\Users\\Bedanvance\\PycharmProjects\\pythonProject2\\反射.py'>
#上面代表真正的self代表模块本身!!
print(sys.modules['__main__'])
mod=sys.modules['__main__']

print(mod.p1)#直接打印person的对象

#利用modules可以直接在python文件夹下获取方法,属性等!!
if hasattr(mod,'p1'):
    o=getattr(mod,'p1')
    #print(o)

'''
通过modules经过反射拿到对象p1和直接打印p1产生的是同样的内存结果
'''

if hasattr(mod,'say_hi'):
    o=getattr(mod,'say_hi')
    o()

if hasattr(Person,'walk'):
    o=getattr(Person,'walk')
    o(p1)
print(__name__)#__main__ 代表模块本身,self
#这里的__name__就代表当前文件的名称!!

if __name__=="__main__":  #该if判断语句只会在被别的模块导入的时候发挥作用,被模块导入时就不会被执行,只有在当前python文件下才发挥作用!!
    print('hahahhaha')
'''
__name__在当前模块主动执行情况下(不是被导入执行),等价于__main__就表示说是在当前文件下执行,而不是说是另外写一个python文件下执行
        在被其他模块导入执行情况下,__name__就等价于模块名,模块名就是说是__name__存在下的文件的名称
'''

解释:

直接对__name__进行打印,我们看到的是代表模块本身__main__

问题2:什么叫做模块本身?

答:就是说该python文件就是模块本身

对 if 语句,该语句只会在该模块作为一个导入模块的时候发挥作用,就是说当别的python文件用import进行导入时,该If语句不会被执行,就可以发现该模块不是其本身模块,而是调用过来的模块!!

mod=sys.modules['__main__']

该语句直接调取本模块的本身地址!!!

直接可以使用mod结合反射语法去调用模块中所有的对象和方法

以下不用看:纯纯八股文!!

反射的定义:主要是应用于类的对象上,在运行时,将对象中的属性和方法反射出来。
    使用场景:可以动态的向对象中添加属性和方法。也可以动态的调用对象中的方法或者属性。
    反射的常用方法:
        1.hasaattr(obj,str)
            判断输入的str字符串在对象obj中是否存在(属性或方法),存在返回True,否则返回False
        2.getattr(obj,str)
            将按照输入的str字符串在对象obj中查找。如找到同名属性,则返回该属性;如找到同名方法,则返回方法的引用,
            想要调用此方法得使用 getattr(obj,str)()进行调用。
            如果未能找到同名的属性或者方法,则抛出异常:AttributeError。
        3.setattr(obj,name,value)
            name为属性名或者方法名,value为属性值或者方法的引用
            1) 动态添加属性。如上
            2)动态添加方法。首先定义一个方法。再使用setattr(对象名,想要定义的方法名,所定义方法的方法名)
        4.delattr(obj,str)
            将你输入的字符串str在对象obj中查找,如找到同名属性或者方法就进行删除

猜你喜欢

转载自blog.csdn.net/qq_46044325/article/details/127073631