1. 程式人生 > >python學習day27 反射 內建的類方法

python學習day27 反射 內建的類方法

isinstance(obj,cls) 檢查obj是否是cls類的物件

issubclass(sub,super) 檢查sub類是否是super類的子類

反射

是用字串型別的名字 去操作 變數

為什麼不用eval()?

name = 1
eval('print(name)')   # 1

因為eval()操作的是一個字串程式碼,這段字串我們拿過來對立面的資訊什麼都不知道,會有很大的安全隱患

而反射只是通過字串來操作記憶體裡的變數

  • setattr
  • delattr
  • getattr
  • hasattr

反射物件的屬性和方法

class A:
    
def func(self): print('in func') a = A() a.name = 'alex' a.age = 63 # 反射物件的屬性 ret = getattr(a, 'name') # 通過變數名的字串形式取到的值 print(ret) # 'alex' print(a.__dict__) # 檢視物件a中的所有屬性 變數名 = input('>>>') # func print(getattr(a, 變數名)) print(a.__dict__[變數名]) #也可以通過這樣來呼叫屬性 # 反射物件的方法 a.func() ret
= getattr(a,'func') ret() # 執行方法

 

反射的屬性和方法

class A:
    price = 20  # 靜態屬性
    @classmethod
    def func(cls):
        print('in func')


# 反射類的屬性 print(getattr(A,'price')) # 反射類的方法 :classmethod staticmethod if hasattr(A,'func'): getattr(A,'func')()

反射模組的屬性和方法

定義模組my.py

day = '
Monday' def wahaha(): print('wahaha')

反射

import my
# 反射模組的屬性
print(my.day)
print(getattr(my,'day'))

# 反射模組的方法
getattr(my,'wahaha')()

反射當前模組的屬性和方法

def qqxing():
    print('qqxing')
year = 2018
import sys
# print(sys.modules['__main__'].year)  # sys.modules檢視當前模組的名字

# 反射自己模組中的變數
print(getattr(sys.modules['__main__'],'year'))

# 反射自己模組中的函式
getattr(sys.modules['__main__'],'qqxing')()
變數名 = input('>>>')
print(getattr(sys.modules[__name__],變數名))  # 一般情況下用__name__變數 獲取當前模組的名字

 

要反射的函式中有引數怎麼辦?

import time

print(time.strftime('%Y-%m-%d %H:%M:S'))  # 為時間打上格式
print(getattr(time,'strftime')('%Y-%m-%d %H:%M:S'))  # 後面傳參就行了

 

setattr和delattr   (不重要)

# setattr  設定修改變數
class A:
    pass
a = A()
setattr(a,'name','nezha')
setattr(A,'name','alex')
print(A.name)
print(a.name)

# delattr 刪除一個變數
delattr(a, 'name')
print(a.name)  # alex
delattr(A,'name')
print(a.name)  # 報錯

 

 

__str__和__repr__

__del__

 

item系列

__getitem__

__setitem__

__delitem__