人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

Python中的反射知識(shí)點(diǎn)總結(jié)

發(fā)布日期:2021-12-09 13:37 | 文章來(lái)源:源碼之家

通過(guò)字符串映射或修改程序運(yùn)行時(shí)的狀態(tài)、屬性、方法, 可以通過(guò)下面這4中方法

''' 
使用getattr(object, name_str, default=None) 方法獲取object對(duì)象里
對(duì)應(yīng)的方法或者屬性的內(nèi)存地址
如果是屬性:直接返回屬性值
如果是方法:返回方法的內(nèi)存地址  
'''
# hasattr(object,name_str) 判斷object對(duì)象是否有一個(gè)名為name_str的方法或者屬性

代碼演示:

# -*- coding:utf8 -*-
class  Person(object):
 def __init__(self, name):
  self.name = name
 def fun(self):
  print("%s正在玩耍" % self.name)
p1 = Person("某人飛")
name_str = input("請(qǐng)輸入方法或者屬性").strip()
# hasattr(object,name_str) 判斷object對(duì)象是否有一個(gè)名為name_str的方法或者屬性
if hasattr(p1, name_str):
''' 
如果有就可以使用getattr(object, name_str, default=None) 方法獲取object對(duì)象里
對(duì)應(yīng)的方法或者屬性的內(nèi)存地址
如果是屬性:直接返回屬性值
如果是方法:返回方法的內(nèi)存地址  
'''
print(getattr(p1, name_str , 80))
# >>>name: 某人飛
# >>>fun : <bound method Person.fun of <__main__.Person object at 0x0000020B76A81370>>
# 所以如果是方法,那么可以這么處理
a = getattr(p1, name_str)
a()
else:
 print("該對(duì)象沒(méi)有這些屬性和方法")
判斷和獲取的演示

如果對(duì)象沒(méi)有從鍵盤錄入的該方法,那么可以使用,setattr添加一個(gè)方法

def bulk(self):
 print("這是在%s對(duì)象的類外部創(chuàng)建的方法"%self.name)

class  Person(object):
 def __init__(self, name):
  self.name = name
 def fun1(self):
  print("%s正在玩耍" % self.name)
p1 = Person("某人飛")
name_str = input("請(qǐng)輸入您的方法或者屬性").strip()
if hasattr(p1, name_str):
 a = getattr(p1, name_str)
 a()
else:  #如果沒(méi)有這個(gè)方法,那么為其創(chuàng)建一個(gè)已經(jīng)存在的方法
 """
 setattr(p1, name_str, bulk)
 為對(duì)象p1添加一個(gè)已經(jīng)存在的bulk的方法,命名為name_str
 """
 setattr(p1, name_str, bulk)
 a = getattr(p1, name_str)
 a(p1)
"""
運(yùn)行結(jié)果
請(qǐng)輸入您的方法或者屬性u(píng)i
這是在某人飛對(duì)象的類外部創(chuàng)建的方法
"""
setattr(p1, name_str, bulk)添加方法

如果對(duì)象沒(méi)有從鍵盤錄入的該方法,那么可以使用,setattr添加一個(gè)屬性

class  Person(object):
 def __init__(self, name):
  self.name = name
p1 = Person("某人飛")
name_str = input("請(qǐng)輸入您的方法或者屬性").strip()
if hasattr(p1, name_str):
 a = getattr(p1, name_str)
 print(a)
 # 也可以同setattr修該已有屬性的值
 setattr(p1, name_str, "飛")
 print(p1.name)
else:  #如果沒(méi)有這個(gè)屬性,那么為其添加一個(gè)屬性 ,并為其設(shè)置一個(gè)默認(rèn)值20
 setattr(p1, name_str, 20)
 a = getattr(p1, name_str)
 print(a)
"""
運(yùn)行結(jié)果:
請(qǐng)輸入您的方法或者屬性name
某人飛
飛
運(yùn)行結(jié)果:
請(qǐng)輸入您的方法或者屬性age
20
"""
setattr(p1, name_str, index)添加屬性

刪除對(duì)象中的屬性和方法(其中方法并不能刪除

class  Person(object):
 def __init__(self, name):
  self.name = name
 def fun(self):
  print("這是一個(gè)實(shí)例方法")
p1 = Person("某人飛")
name_str = input("請(qǐng)輸入您的方法或者屬性").strip()
if hasattr(p1, name_str):
 # 刪除這個(gè)對(duì)象的屬性或者方法
 delattr(p1, name_str)
else:
 pass
print(p1.name)
p1.fun()
"""
運(yùn)行結(jié)果:
請(qǐng)輸入您的方法或者屬性name
AttributeError: 'Person' object has no attribute 'name'
運(yùn)行結(jié)果:
請(qǐng)輸入您的方法或者屬性fun
AttributeError: fun
"""
delattr(p1, name_str)只能刪除屬性,和動(dòng)態(tài)添加的方法

注意:通過(guò)delattr能夠刪除通過(guò)setattr動(dòng)態(tài)添加的方法,其實(shí)也是一個(gè)假象。真相是通過(guò)setattr添加的一個(gè)方法并不是真的給這個(gè)對(duì)象添加了一個(gè)方法,而是添加了一個(gè)屬性,setattr方法的第二個(gè)參數(shù)就是這個(gè)屬性的名字,然后這個(gè)屬性的值是一個(gè)指向外部函數(shù)的引用地址,所以當(dāng)我們調(diào)用這個(gè)對(duì)象的屬性時(shí),實(shí)際上是間接調(diào)用了這個(gè)函數(shù),看起來(lái)就像是這個(gè)對(duì)象添加了一個(gè)方法一樣,但本質(zhì)上仍然是添加的一個(gè)屬性。不管是setattr和delattr,其實(shí)都只能針對(duì)對(duì)象的屬性進(jìn)行操作,它們對(duì)對(duì)象的方法是無(wú)法直接操作的。

到此這篇關(guān)于Python中的反射知識(shí)點(diǎn)總結(jié)的文章就介紹到這了,更多相關(guān)Python中的反射內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開通

自選配置、實(shí)時(shí)開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問(wèn)服務(wù)

1對(duì)1客戶咨詢顧問(wèn)

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部