Learning-Python【26】:反射及內置方法
阿新 • • 發佈:2018-10-25
回收 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】:反射及內置方法