面向對象——格式化|析構|反射
1、__str__:
# 格式化方法:在外界打印該對象的時被調用
# 格式化外界直接打印改類對象的字符串表示結果
1 class A: 2 def __init__(self,name,age): 3 self.name=name 4 self.age=age 5 def __str__(self): 6 return ‘<name:%s|age:%s>‘%(self.name,self.age) 7 8 a=A(‘老王‘,88) 9 print(a)#<name:老王|age:88>
2、__del__:
# 析構方法:在對象被銷毀的時候被調用,在銷毀前可以做一些事情
1 class A: 2 def __init__(self, name, age): 3 self.name = name 4 self.age = age 5 6 def __del__(self): 7 # del會在self代表的對象被消耗的時候被調用 8 # 我們可以在析構函數中釋放該對象持有的其他資源, 9 # 或者將一些持有資源持久化(保存到文件或數據庫中)10 del self.name 11 12 a = A(‘老王‘, 88) 13 print(a, type(a))
3、了解 對象.語法的內部實現
1 class B: 2 # 了解:對象.語法的內部實現 3 def __setattr__(self, key, value): 4 # print(key, value) 5 b.__dict__[key] = value 6 # b.__dict__[key] = value.lower() 7 # b.__dict__[‘xyz‘] = ‘XYZ‘8 9 # 了了解:將對象添加屬性的方式可以同字典形式 10 def __setitem__(self, key, value): 11 self.__dict__[key] = value 12 13 14 b = B() 15 b.name = ‘BBB‘ # b.__dict__[‘name‘] = ‘BBB‘ 16 print(b.name) 17 18 b[‘age‘] = 18 19 print(b.age) # 訪問還是通過.語法訪問
4、反射:通過字符串與類及類的對象的屬性(方法)建立關聯
反射:
通過 字符串 來操作類與對象的屬性。
hasattr()
判斷對象或者類的屬性是否存在!
getattr()
獲取對象或者類的屬性
參數1: 對象
參數2: ‘屬性名‘
參數3: 默認值
setattr()
設置對象或者類的屬性
delattr()
刪除對象或者類的屬性
# 反射:通過字符串與類及類的對象的屬性(方法)建立關聯
class A:
num = 10
print(hasattr(A, ‘num‘))
res = getattr(A, ‘num‘, ‘默認值‘)
print(res)
delattr(A, ‘num‘)
print(setattr(A, ‘tag‘, 10))
# 類的屬性類來操作
class B:
def __init__(self, name):
self.name = name
print(hasattr(b, ‘name‘))
print(getattr(b, ‘name‘, ‘對象的屬性類不能獲取‘))
delattr(b, ‘name‘)
print(setattr(b, ‘age‘, 18))
# 對象的屬性對象來操作
class C:
def fn(self):
print(‘fn‘)
@classmethod
def func(cls):
print(‘func‘)
fn = getattr(C, ‘fn‘)
c = C()
fn(c) # 類獲取對象方法調用時傳入具體的對象
obj_fn = getattr(c, ‘fn‘)
obj_fn() # 對象獲取對象方法調用時不用傳參
func = getattr(C, ‘func‘)
func() # 類獲取類方法調用時不需要傳入參數
# 總結:
# 類的屬性用類來操作
# 對象的屬性用對象來操作
# 方法建議使用類來操作,得到的方法調用時
# -- 對象的方法要傳入具體的對象
# -- 類的方法不需要傳入參數
面向對象——格式化|析構|反射