Python學習之路——類-物件導向程式設計

PENGJUNQIAO發表於2022-04-26

物件導向程式設計

  • 通過類獲取一個物件的過程 - 例項化

  • 類名()會自動呼叫類中的__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])()

相關文章