python-37-各類反射

前言

python中的一切事物都是對象,均可以使用反射!python面向對象中的反射是:經過字符串的形式操做任何對象相關的類、方法及屬性。python

反射對象中的屬性和方法,有這幾個方法:函數

  • hasattr()
  • getattr()
  • setattr()
  • delattr()

一、反射對象的屬性,getattr:學習

# 一、反射對象的屬性:
class A:
    dic={
        'a':1,
        'b':2,
        'c':''}
    def __init__(self,name):self.name=name
res=A('廣深小龍')
r=getattr(res,'name')       # 查看屬性:(實例化對象,屬性變量名)
print(r)

 二、反射對象的方法,getattr:spa

# 二、反射對象的方法:
class A:
    dic={
        'a':1,
        'b':2,
        'c':''}
    @staticmethod
    def func():
        return 'qasdasdasd'
r1 = getattr(A,'func')
print(r1)           # 拿到的是func方法
print(r1())         # 能夠調用到函數

 三、反射類的屬性,getattr:code

# 三、反射類的屬性:
class A:
    dic = {
        'a':'ff',
        'b':'func'}
print(getattr(A,'dic'))

 四、反射類的方法,getattr:對象

# 四、反射類的方法:
class A:
    dic = {
        'a':'ff',
        'b':'func'}
    @staticmethod
    def ff():return '調用了ff方法'
    @classmethod
    def func(cls):return '調用了func方法'
    def hub(self):return '調用了hub方法'
print(getattr(A,'ff')())
print(getattr(A(),'hub')()) # 注意:A()是由於hub是普通類的方法須要傳self

if hasattr(A(),'hub'):  # hasattr 判斷是否存在,返回bool
    print(getattr(A,'func')())

五、反射模塊的屬性與方法,getattr:
內置函數、本身定義的函數均可以使用blog

# 五、反射模塊的屬性與方法
# 內置函數、本身定義的函數均可以使用
import test
getattr(test,'r')               # 反射模塊的屬性
func=getattr(test,'func')      # 反射模塊的方法
print(func())

 六、反射本身模塊中的變量與方法,getattr:字符串

# 六、反射本身模塊中的變量與方法
name = '廣深小龍'
def func():
    return 'func函數'

import sys
print(getattr(sys.modules['__main__'],'name'))     # 反射本身模塊的變量
print(getattr(sys.modules['__main__'],'func')())   # 反射本身模塊的函數

 可能給其餘模塊調用就將'__main__'改成變量:__name__get

# 可能給其餘模塊調用就將'__main__'改成變量:__name__
import sys
def name():return '小龍女'
ret=print(getattr(sys.modules[__name__],'name')())# 反射本身模塊的函數

七、反射帶參數、反射模塊的類函數,getattr,hasattr:it

# 七、反射帶參數、反射模塊的類函數
class A:
    @staticmethod
    def func(name,age):return name+age
print(getattr(A,'func')('廣深小龍','23'))   # 反射帶參數
import test
if hasattr(test,'A'):                        # 判斷是否反射到其餘模塊類:A,返回bool
    res = getattr(test,'A')()                # 反射其餘模塊的類:A
    print(res.f())
else:print('沒有反射到對象!')

八、新增靜態屬性:setattr; 刪除靜態屬性:delattr

# 八、新增靜態屬性:setattr
class A:pass
a = A()
setattr(a,'name','廣深小龍')
setattr(A,'name','小龍')
print(a.name)
print(A.name)

# delattr 刪除靜態屬性
delattr(a,'name')      # 刪除實例化的a
print(a.name)           # 找的是類的name,由於原來的 廣深小龍 被刪除了

 歡迎來你們QQ交流羣一塊兒學習:482713805 !!!

相關文章
相關標籤/搜索