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])()
Tags: