关于在相同或者不同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中查找,如找到同名属性或者方法就进行删除

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天的学习日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值