1. 程式人生 > >27反射、類的內置方法

27反射、類的內置方法

modules sel 自己的 刪除字符 __del__ 打印 get time ret

一、反射

1、什麽是反射?

  用字符串類型的名字去操作變量

2、反射對象中的屬性和方法

  getattr\hasattr\setattr\delettr

3、 getattr:通過字符串類型的名字取到變量的值

  hasattr:判斷字符串類型的名字對應的值是否存在

  setattr :(建立)設置字符串類型的名字和值

  deleattr:刪除字符串類型的變量

getattr:

class A:
    def func(self):
        print(in func)

a = A()
a.name = alex
a.age = 63
# 反射對象的屬性
ret = getattr(a,
name) # 通過變量名的字符串形式取到的值 print(ret)

hasattr(與getattr配合使用)

class A:
    price=20
    @classmethod
    def func(self):
        print(in the func)
if hasattr(A,func):                  #hasattr判斷是否變量存在
    ret=getattr(A,func)
    ret()

反射模塊中的屬性和方法:

  可以反射模塊(包括內置模塊)的屬性和方法,可以反射自己模塊(其他模塊)的函數和變量,還可以反射一個模塊的類。

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

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

#內置模塊也能用
time
asctime
import time
print(getattr(time,time)())
print(getattr(time,asctime)())

def qqxing():
    print(qqxing)
year = 2018
import sys
print(sys.modules[__main__].year)
# 反射自己模塊中的變量
print(getattr(sys.modules[__main__],year)) # 反射自己模塊中的函數 getattr(sys.modules[__main__],qqxing)() 變量名 = input(>>>) print(getattr(sys.modules[__name__],變量名)) #要反射的函數有參數怎麽辦? print(time.strftime(%Y-%m-%d %H:%M:S)) print(getattr(time,strftime)(%Y-%m-%d %H:%M:S)) #一個模塊中的類能不能反射得到? import my print(getattr(my,C)()) if hasattr(my,name): getattr(my,name)

setattr:設置修改值

  

class A:
    def func(self):
        pass
a=A()
setattr(a,name,alex)
print(getattr(a,name))

delattr:刪除一個變量

# delattr 刪除一個變量
delattr(a,name)
print(a.name)
delattr(A,name)
print(a.name)

二、類的內置方法

__str__ 、__repr__、__del__、__len__、__call__

__str__:自己沒有__str__方法的時候,就去父類object去調用,返回調用這個方法的對象的內存地址,如果自己定義了__str__方法,那麽就執行自己的__str__方法,打印這個對 象的時候,就會執行a.__str__方法(默認就執行了),(返回一些自己定義的方法)。

class A:
    def __str__(self):
        return "A‘s object"
a=A()
print(a)

__repr__:類似__str__方法,就是調用repr執行的內置方法,%r,print(repr)也是執行的它(不知道它有什麽用)

__del__:析構函數,刪除一個對象之前進行一些收尾工作

__call__:執行函數的時候自動執行打印一些屬性

27反射、類的內置方法