反射(內(nèi)置函數(shù)補充)

一,反射

# 什么是反射?
# 指的是在程序運行過程中可以"動態(tài)(不見棺材不掉淚)"獲取對象的信息
# 動態(tài):是指在定一個一個函數(shù)時比如x=5,不需要指定5是是否是init類型,在執(zhí)行的時候會去識別類型
# 為何要用反射?

# 如何實現(xiàn)反射?
class People:
    def __init__(self,name,age):
        self.name=name
        self.age=age

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

obj=People('mzz',13)

# 在肉眼可見知道類People下面有可調(diào)用的say,才能執(zhí)行一下
obj.say()
# mzz:13



# 如果不知道類下面有哪些可以調(diào)用,使用dir查看類下面有哪些屬性
print(dir(obj))
#['__class__', '__delattr__', '__dict__', '__dir__',....... 'age', 'name', 'say']


# 以上的基礎上,可以用索引方式調(diào)出屬性的名字
print(dir(obj)[-2])
# name


# 調(diào)用屬性的值
print(obj.__dict__['age'])
#13

print(obj.__dict__[dir(obj)[-2]])
# mzz






# 實現(xiàn)反射機制的步驟
# 1、先通過多dir:查看出某一個對象下可以.出哪些屬性來
# print(dir(obj))

# 2、可以通過字符串反射到真正的屬性上,得到屬性值
# print(obj.__dict__[dir(obj)[-2]])


二,四個內(nèi)置函數(shù)

1,使用

# 四個內(nèi)置函數(shù)的使用:通過字符串來操作屬性值

class People:
    def __init__(self,name,age):
        self.name=name
        self.age=age

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

obj=People('mzz',13)

#1)hasattr    判斷obj是否有name這個屬性,注意name一定要加上引號
print(hasattr(obj,'name'))         #對象obj是否有name
# True

print(hasattr(obj,'xxx'))
# False



#2) getattr    在hasattr為True的基礎上,通過getattr得到屬性的值
print(hasattr(obj,'name'))
# True

print(getattr(obj,'name'))
# mzz



#3)setattr
setattr(obj,'name','xiaohua')    # 把obj里的name值更改為xiaohua,這里的name本身存在
print(obj.__dict__)
# {'name': 'xiaohua', 'age': 13}


setattr(obj,'hobby','sing')       # obj里添加屬性hobby,值為sing,這里的hobby本身不存在
print(obj.__dict__)
# {'name': 'xiaohua', 'age': 13, 'hobby': 'sing'}


# #PS:以上的obj是自定義,如果是內(nèi)置,,如下,不能夠增加屬性
# x=10
# setattr(x,'name','mzz')
# print(x.__dict__)       # 會報錯   AttributeError: 'int' object has no attribute 'name'


#4)delattr 刪除
print(obj.__dict__)
# {'name': 'xiaohua', 'age': 13, 'hobby': 'sing'}

delattr(obj,'name')
print(obj.__dict__)
# {'age': 13, 'hobby': 'sing'}

2,示例

#例1
# 在hasattr為False的情況下調(diào)用沒有的屬性會報錯,用if判斷防止報錯,如下
class People:
    def __init__(self,name,age):
        self.name=name
        self.age=age

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

obj=People('mzz',13)



if hasattr(obj,'name'):
    print(getattr(obj,'name'))
else:
    print('name不存在')
# mzz



if hasattr(obj,'xxx'):
    print(getattr(obj,'xxx'))
else:
    print('name不存在')
# name不存在





#例2:
class Ftp:
    def put(self):
        print('正在上傳....')

    def get(self):
        print('正在下載....')

    def interactice(self):
        choice=input('>>>>').strip()

        if hasattr(self,choice):
            getattr(self,choice)()
        else:
            print('輸入指令有誤')

obj=Ftp()
obj.interactice()
# >>>>get
# 正在下載....

# >>>>xxxxx
# 輸入指令有誤

PS: 內(nèi)置函數(shù)


# 1,取絕對值
print(abs(-1))
# 1
print(abs(77.7))
# 77.7







# 2,all    any

# all(被循環(huán)出來的值都滿足非0或者None才為True,空是特殊情況)
print(all([1,'aaa','1']))
# True

print(all([1,'aaa',None]))     #all后面被循環(huán)出來的值必須都是非0,None,才是True,空是特殊情況
# False

print(all([]))      # 空也是True,特殊情況
# True




# any
# 只要有一個為真,返回True,空是特殊情況
print(any([0,None,1]))
# True

print(any([]))         # 空是False
# False




# 3,二進制,十進制,十六進制
# 二進制
print(bin(11))
# 0b1011

# 十進制
print(oct(11))
# 0o13

# 十六進制
print(hex(11))
# 0xb





# 4,判斷布偶值,0,'',None為False
print(bool(''))
# False

print(bool('3'))
# True





# 5, callable 判斷是否可以被調(diào)用
def func():
    pass
class Foo:
    pass
print(callable(Foo))
# True





# 6,字母與阿斯表對應,65-90代表A-Z
print(chr(65))
# A

print(ord('A'))
# 65

print(ord('Z'))
# 90



# 7,frozenset,可變類型轉(zhuǎn)為不可變類型
# 集合本身是可變類型
s1={1,2,3}
s1.add(4)
print(s1)
# {1, 2, 3, 4}

# 加上frozenset,變?yōu)椴豢勺兗?# s=frozenset({1,2,3})




# 8,四舍五入
print(round(1.5))
# 2

print(round(1.4))
# 1




# # =================》掌握

#1,zip(拉鏈一樣,一一對應,    對應的多或少不會報錯)
v1='hello'
v2=[111,222,333,444,5555,6666]
res=zip(v1,v2)
print(list(res))
# [('h', 111), ('e', 222), ('l', 333), ('l', 444), ('o', 5555)]







# 2,除以再得出余數(shù)(常用于分頁)
print(divmod(10000,33))
# (303, 1)        #分頁的話,即304頁






# 3,dir判斷對象下有哪些屬性
class Foo:
    pass
obj=Foo()
obj.xxx=1111
print(dir(obj)) # obj.哪些屬性
# ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'xxx']








# 4,索引與值對應 enumerate
for i,v in enumerate(['a','b','c']):
    print(i,v)
# 0 a
# 1 b
# 2 c


for v in enumerate(['a','b','c']):
    print(v)
# (0, 'a')
# (1, 'b')
# (2, 'c')









#5,eval,執(zhí)行字符串中的表達式

# b是個字符串類型
b='{"a":1}'
print(type(b))
# <class 'str'>


# 接上,字符串類型還原""里的內(nèi)容即執(zhí)行字符串中的表達式
res=eval('{"a":1}') # 執(zhí)行字符串中的表達式
print(res,type(res))
# {'a': 1} <class 'dict'>

res1=eval('1+4')       # '1+4'是字符串,加上eval,即執(zhí)行1+4
print(res1)
# 5










# 6,isinstance,判斷是否屬于xx類型

class Foo:
    pass
obj=Foo()
print(isinstance(obj,Foo))   # 判斷obj是否屬于Foo類
# True

# 判斷[]是否屬于列表
print(isinstance([],list)) # 類型判斷推薦使用isinstance
# True

# 同上判斷列表也可以以下方式
print(type([]) is list) # 不推薦使用
# True







#7,導導入的模塊實例化
# import 'time' # 錯誤
t=__import__('time')
t.sleep(3)

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容