什么時候適用面向?qū)ο螅?/h3>
- 如果多個函數(shù)須傳入多個共同的參數(shù)時
- 根據(jù)一個模板創(chuàng)建某些東西
- (ssh)
類的特殊成員
1. __doc__ #輸出:類的描述信息
2. __module__ 和 __class__
__module__ 表示當(dāng)前操作的對象在那個模塊
__class__ 表示當(dāng)前操作的對象的類是什么
3. __init__
構(gòu)造方法,通過類創(chuàng)建對象時,自動觸發(fā)執(zhí)行。
4. __del__
析構(gòu)方法,當(dāng)對象在內(nèi)存中被釋放時,自動觸發(fā)執(zhí)行。
5. __call__
對象后面加括號,觸發(fā)執(zhí)行。即: 對象() 或 類()()
class Foo:
def __init__(self):
pass
def __call__(self, *args, **kwargs):
print('__call__')
obj = Foo() # 執(zhí)行 __init__
obj() # 執(zhí)行 __call__
6. __dict__ 類或?qū)ο笾械乃谐蓡T
7. __str__
如果一個類中定義了__str__方法,那么在打印 對象 時,默認(rèn)輸出該方法的返回值。
8. __getitem__ __setitem__ __delitem__
類似字典一樣索引的操作,以上分別表示獲取,設(shè)置,刪除。(當(dāng)在類外面做了這些操作后觸發(fā)這些函數(shù),甚至可刪除不存在的數(shù)據(jù))
class Foo(object):
def __getitem__(self, key):
print('__getitem__',key)
def __setitem__(self, key, value):
print('__setitem__',key,value)
def __delitem__(self, key):
print('__delitem__',key)
obj = Foo()
result = obj["k1"] # 自動觸發(fā)執(zhí)行 __getitem__
obj['k2'] = 'wupeiqi' # 自動觸發(fā)執(zhí)行 __setitem__
del obj['k1'] # 自動觸發(fā)執(zhí)行 __delitem__
__getitem__ k1
__setitem__ k2 wupeiqi
__delitem__ k1
9. __new__ 用來將類實(shí)例化的
def __new__(cls,*args,**kwargs): #重構(gòu)__new__方法:在實(shí)例化之前做些事情
print("Foo --new--")
return object.__new__(cls) #繼承父類的__new__方法(此時cls是一個對象)
反射(用戶交互)
hasattr(obj,name_str) 判斷一個對象obj中是否有對應(yīng)的name_str字符串方法,返回布爾值
getattr(obj,name_str) 根據(jù)字符串去獲取obj對象里的對應(yīng)方法的內(nèi)存地址
setattr(d,name_str,[new]) 給對象的屬性\方法重新定義,若不存在,先創(chuàng)建再賦值。
class Dog(object):
def __init__(self,name):
self.name = name
def eat(self,food):
print("%s is eating %s" %(self.name,food))
def bulk(name):
print("%s is yelling ..." %name)
d = Dog("xiaohei")
choice = input(">>: ").strip()
if hasattr(d,choice):
func = getattr(d,choice)
func("xiaoqiang")
else:
# setattr(d,choice,"black") #--1-- 設(shè)置變量
# v = getattr(d,choice)
# print(v)
setattr(d,choice,bulk) #--2-- 設(shè)置方法
bulk(d.name)