python 反射

反射

反射:其实就是用字符串类型的名字去操作变量

这在一些只能拿到字符串类型名字的情况下就极为好用了

反射对象的属性      (用到的关键字:getattr)

class A:     #先创建一个类
    price = 25
    def func(self):    #定义一个方法
        print('卖橘子啦')
a = A()             #实例化一个对象
a.name = 'sakura'  #给对象添加一个属性 名字=樱花
print(getattr(a,'name'))  #getattr(对象,'属性名')  这个属性名一定是字符串形式

sakura  

反射对象的方法

class A:     #先创建一个类
    price = 25
    def func(self):    #定义一个方法
        print('卖橘子啦')
a = A()             #实例化一个对象
a.name = 'sakura'  #给对象添加一个属性 名字=樱花
getattr(a,'func')()  #getattr(对象,'方法名')

卖橘子啦

反射类的属性

class A:     #先创建一个类
    price = 25
    def func(self):    #定义一个方法
        print('卖橘子啦')
a = A()             #实例化一个对象
a.name = 'sakura'  #给对象添加一个属性 名字=樱花
print(getattr(A,'price'))  # getattr(类,'属性名')

25

反射类的方法

class A:     #先创建一个类
    price = 25
    def func(self):    #定义一个方法
        print('卖橘子啦')
a = A()             #实例化一个对象
a.name = 'sakura'  #给对象添加一个属性 名字=樱花
ret = getattr(A,'func') #getattr(类,'方法名')   这样得到的是一个方法的内存地址记得调用
ret(a)                #调用一个方法一定要给它传个参数
getattr(A,'func')(a) #这个是上面那个的简写形式

卖橘子啦
卖橘子啦

如果调用类中没有的属性或方法,程序报错怎么办

这时候就要用到一个和getattr配套使用的 hasattr

class A:     #先创建一个类
    price = 25
    def func(self):    #定义一个方法
        print('卖橘子啦')
a = A()             #实例化一个对象
a.name = 'sakura'  #给对象添加一个属性 名字=樱花
if hasattr(A,'funs'): # 作用就是判断类中有没有这个方法 如果有就执行下一步
    getattr(A,'funs')(a) #这个是上面那个的简写形式

可以看见 程序并没有报错 也就是没有执行funs方法

除此之外,还能反射模块中的方法和属性

反射自己模块中的变量和函数

def funs():  #写一个简单的函数
    print('你站在这里不要走动,我去给你把橘子树搬来')

现在 有了一个函数,那该怎么调用它呢

import sys        #使用sys模块
def funs():  #写一个简单的函数
    print('你站在这里不要走动,我去给你把橘子树搬来')
year = 8102
print(sys.modules['__main__'])   #这样就能调用自己的模块了 (在内存中自己写的没有使用的模块都叫__main__)
# 现在知道自己写的函数就是sys.modules['__main__']
print(getattr(sys.modules['__main__'],'year'))

打印出来第一个是:一个函数的内存地址

第二个是:8102

import sys        #使用sys模块
def funs():  #写一个简单的函数
    print('你站在这里不要走动,我去给你把橘子树搬来')
year = 8102
getattr(sys.modules['__main__'],'funs')()  #这样就可以调用这个函数了
getattr(sys.modules[__name__],'funs')()     # 有些情况下 函数名字也会改变之类的, 所以把它设成变量更好

你站在这里不要走动,我去给你把橘子树搬来
你站在这里不要走动,我去给你把橘子树搬来

设置修改变量

class Circle: #创建一个类
    pass
a = Circle()   #实例化一个对象
a.name = 'sakura'  #给这个对象一个属性 名字=樱花
print(a.name)
setattr(a,'name','dark')  #用setattr修改name的值
print(a.name)

sakura
dark

可以看见name的值被修改了

删除一个变量

class Circle:
    print('这个是橘子树')
a = Circle()

这个是橘子树

现在有一个类和一个对象

class Circle:
    print('这个是橘子树')
a = Circle()
delattr(Circle,'a') #delattr(类或对象,'属性名')

这样就把类中的a对象删除了

posted @ 2018-01-22 16:51  GrandDarkness  阅读(178)  评论(0编辑  收藏  举报