1. 程式人生 > >面向對象——格式化|析構|反射

面向對象——格式化|析構|反射

類方法 存在 print 類的屬性 self 形式 val init func

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() # 類獲取類方法調用時不需要傳入參數


# 總結:
# 類的屬性用類來操作
# 對象的屬性用對象來操作
# 方法建議使用類來操作,得到的方法調用時
# -- 對象的方法要傳入具體的對象
# -- 類的方法不需要傳入參數

面向對象——格式化|析構|反射