Python學習之路——類-面向對象編程
類
面向對象編程
-
通過類獲取一個對象的過程 – 實例化
-
類名()會自動調用類中的__init__方法
-
類和對象之間的關係?
- 類 是一個大範圍 是一個模子 它約束了事務有哪些屬性 但是不能約束具體的值
- 對象 是一個具體的內容 是模子的產物 它遵循了類的約束 同時給屬性賦上具體的值
-
類有一個空間 存儲的是定義在class中的所有名字
-
每一個對象又擁有自己的空間 通過對象名.__dict__就可以查看這個對象的屬性和值
print(alex.name) # print(alex.dict[‘name’]) 屬性的查看
alex.name = ‘alexsb’ # 屬性的修改
alex.money = 100 # 屬性的增加
del alex.money # 屬性的刪除 -
練習類的創建和實例化
d = [‘k’:’v’]
print(d,id(d))
d[‘k’] = ‘vvvv’
print(d,id(d)) -
修改列表\字典中的某個值,或者是對象的某一個屬性 都不會影響這個對象\字典\列表所在的內存空間
實例化所經歷的步驟
1.類名() 之後的第一個事兒:開闢一塊兒內存空間 2.調用__init__把空間的內存地址作為self參數傳遞到函數內部 3.所有的這一個對象需要使用的屬性都需要和self關聯起來 4.執行完init中的邏輯之後,self變量會自動的被返回到調用處(發生實例化的地方)
-
dog類 實現狗的屬性 名字 品種 血量 攻擊力 都是可以被通過實例化被定製的
class Dog():
def init(self,name,blood,aggr,kind):
self.dog_name = name
self.hp = blood
self.ad = aggr
self.kind = kind小白 = Dog('小白',5000,249,'柴犬') print(小白.dog_name) print(小白.__dict__)
-
對象/實例 = 類名() => 實例化的過程
-
對象的屬性/實例變量
-
類中的方法(函數) 有一個必須傳的參數 self 對象
-
hasattr getattr setattr delattr 反射
- 實例對象
- 類
- 本模塊 sys.modules[name]
- 其他模塊
if hasattr(obj,’name’):
getattr(obj,’name’)
-
找到tbjx對象 的c類 實例化一個對象
obj = getattr(tbjx,’C’)() -
找到tbjx對象 的c類 通過對c類這個對象使用反射取到area
print(getattr(tbjx.C,’area’)) -
找到tbjx對象 的c類 實例化一個對象 對對象進行反射取值
obj = getattr(tbjx,’C’)(‘趙海狗’)
print(obj.name)
print(getattr(obj,’name’)) -
一次執行多個函數
def func1():
print(‘in func1’)func_lst = [f'func{i}' for i in range(1,5)] for func in func_lst: getattr(sys.modules[__name__],func)()
-
反射應用
class User:
user_list = [(‘login’,’登錄’),(‘register’,’註冊’),(‘save’,’存儲’)]def login(self): print('歡迎來到登錄頁面') def register(self): print('歡迎來到註冊頁面') def save(self): print('歡迎來到存儲頁面') # choose_dic = { # 1: User.login, # 2: User.register, # 3: User.save, # } while 1: choose = input('請輸入序號:\n1:登錄\n2:註冊\n3:存儲\n').strip() obj = User() # choose_dic[int(choose)](obj) getattr(obj,obj.user_list[int(choose)-1][0])() # getattr(obj,obj.user_list[int(1)-1][0])()