1. 程式人生 > >Learning-Python【26】:反射及內置方法

Learning-Python【26】:反射及內置方法

回收 hasattr pass ict 不能 setattr hid 運行 opened

反射的概念

可以用字符串的方式去訪問對象的屬性,調用對象的方法(但是不能去訪問方法),Python 中一切皆對象,都可以使用反射。

反射有四種方法:

hasattr:hasattr(object, name)判斷一個對象是否有 name 屬性或者 name 方法。有就返回 True,沒有就返回 False

getattr:獲取對象的屬性或者方法,如果存在則打印出來。hasattr 和 getattr 配套使用

  需要註意的是,如果返回的是對象的方法,返回出來的是對象的內存地址,如果需要運行這個方法,可以在後面添加一對()

setattr:給對象的屬性賦值,若屬性不存在,先創建後賦值

delattr:刪除該對象指定的一個屬性

技術分享圖片
class Foo():
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def tell_info(self):
        print(%s: %s %(self.name, self.age))

obj = Foo("egon", 18)

print(hasattr(obj, "name"))

res1 = getattr(obj, "name")
print(res1)
res2 
= getattr(obj, "xxx", None) print(res2) setattr(obj, "age", 38) print(obj.__dict__) setattr(obj, "gender", "male") print(obj.__dict__) delattr(obj, "name") print(obj.__dict__)
反射

isinstance 和 issubclass

isinstance(obj, cls):檢查 obj 是不是 cls 的對象(傳兩個參數,一個是對象,一個是類)

issubclass(sub, super):檢查 sub 是不是 super 的子類(傳兩個參數,一個是子類,一個是父類)

技術分享圖片
class Foo:
    pass

class Son(Foo):
    pass

s = Son()
print(isinstance(s, Son))   # 判斷s是不是Son的對象
print(type(s) is Son)
print(isinstance(s, Foo))   # 判斷s是不是Foo的對象  不精準
print(type(s) is Foo)       # type比較精準

print(issubclass(Son, Foo)) # 判斷Son是不是Foo的子類
print(issubclass(Son, object))
print(issubclass(Foo, object))
print(issubclass(int, object))
View Code

內置方法

1、__str__ 和 __repr__:改變對象的字符串顯示

技術分享圖片
class Foo:
    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return obj in str  # 這裏只能是return
    # def __str__(self):
    #     return ‘%s obj in str‘%self.name

f = Foo(egon)
print(f)  # 優先執行__str__裏面的內容
# 那麽你是不是據地__repr__沒用呢?
# print(‘%s‘%f)  #執行的是__str__裏面的返回值
# print(‘%r‘%f)  #執行的是__repr__裏面的返回值
print(==============)
print(str(f))  # 當執行str(f)時,會去找__str__這個方法,如果找不到的時候,__repr__這個方法就給替補了
print(repr(f))
# 1.當打印一個對象的時候,如果實現了__str__方法,打印__str__中的返回值
# 2.當__str__沒有被實現的時候,就會調用__repr__方法
# 3.但是當你用字符串格式化的時候,%s和%r會分別調用__str__和__repr__方法
# 4.不管是在字符串格式化的時候還是在打印對象的時候,__repr__方法都可以作為__str__方法的替補,但反之則不行
# 5.用於友好的表示對象。如果__str__和__repr__方法你只能實現一個: 先實現__repr__
View Code

2、__del__:會在對象被刪除時自動觸發執行,用來在對象被刪除前回收系統資源

技術分享圖片
class Foo:
    def __del__(self):
        print(===>)

obj=Foo()
# del obj
print(其他代碼...)
View Code

Learning-Python【26】:反射及內置方法