類
物件導向程式設計
-
通過類獲取一個物件的過程 - 例項化
-
類名()會自動呼叫類中的__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])()