1. 程式人生 > >10-python基礎知識-面向物件

10-python基礎知識-面向物件

面向物件

面向物件

  • 與面向過程對比
    • 面向過程:數學邏輯的對映,學會做個好員工
    • 面向物件:生活邏輯的對映,學會做個好領導
  • 生活例項
    • 類: 人 手機 電腦
    • 物件: 小明、老王 你的手機、我的手機 我的電腦、你的電腦
  • 官方定義
    • 類:具有相同特徵(屬性和行為)事物的抽象
    • 物件:某個類的具象
  • 程式語言
    • 類:是一種自定義的資料型別
    • 物件:某個類型別的變數

基礎語法

  • 類的定義

    class 類名:
    	pass
    
  • 使用說明:

    • 定義類的關鍵字是class
    • 類名:原則上符合識別符號命名規範即可,但是通常都採用大駝峰風格命名,如:UserName
    • 類名後不要忘記’:’
    • 類的內容要進行整體縮排
    • 屬性可以通過變數體現,行為通過函式體現
    • 成員訪問:
      • 屬性:物件.屬性名
      • 方法:物件.方法名()
    • 示例:
    # 定義類
    class Person:
        # 行為通過函式體現
    
        # 吃飯
        def eat(self):
    print('毛氏紅燒肉,聽說很好吃!') # 睡覺 def sleep(self): print('喜歡睡覺也是生活態度!') # 建立物件 p = Person() # print(p) # 屬性可以動態新增 p.name = 'ergou' p.age = 22 print(p.name, p.age) # 呼叫成員方法 p.eat() p.sleep()
  • self使用

    class Person:
        def run(self):
            # self表示當前物件,就是呼叫該方法的物件
    print('{}每天以2m/s的速度奔跑5km'.format(self.name)) def introduce(self): # 訪問成員屬性 print('我叫{},今年18歲'.format(self.name)) # 呼叫成員方法 # self的名字可以修改,但是通常都不改,呼叫方法時該引數不傳 self.run() lulu = Person() lulu.name = '露露' # lulu.run() lulu.introduce() yanbo = Person() yanbo.name = '彥博' # yanbo.run() yanbo.introduce()
  • __str__方法

    class Person:
        # 列印物件時預設列印:類名+地址
        # 重寫該方法,列印物件時會列印該方法的返回值
        # 該方法必須返回一個字串
        # 使用str方法強制型別轉換時也會呼叫該方法
        def __str__(self):
            return '我是{},今年{}歲'.format(self.name, self.age)
        
    p = Person()
    p.name = '勒布朗.詹姆斯'
    p.age = 34
    print(p)
    
    s = str(p)
    print(s)
    
  • __init__方法

    class Cat:
          def __str__(self):
              return 'name:{},age:{},color:{}'.format(self.name, self.age, self.color)
    
          # 構造方法:建立物件後會自動呼叫,可以進行初始化設定
          def __init__(self, name, age, color):
              # print('__init__')
              self.name = name
              self.age = age
              self.color = color
            
    # 這種方式比較繁瑣
    # jiafei = Cat()
    # jiafei.name = '加菲'
    # jiafei.age = 2
    # jiafei.color = '橘黃色'
    # print(jiafei)
    
    jiafei = Cat('加菲', 2, '橘黃色')
    print(jiafei)         
    
  • __del__方法

    class Pig:
        # 析構方法:當物件釋放時,系統會自動呼叫
        # 該方法一般做資源釋放操作,如:斷開資料庫連線、檔案關閉
        def __del__(self):
            print('大師兄,我不行了')
            
    bajie = Pig()
    del bajie
    print('八戒,一路走好!')         
    
  • 思考:小明手裡有兩張牌,左手♥K,右手♠A,小明交換兩手的牌後,手裡分別是什麼?

    • 先找到物件:♥K、♠A、左手、右手、小明
    • 根據物件抽象類:人、手、牌
    • 設計相關的類,需要根據功能反覆完善

常用內建函式

  • 內建函式:在類中,特定的時刻會自動觸發的函式

  • __init__、__del__、__str__

  • __setattr__、__getattr__、__delattr__

    class Person:
        def __init__(self, name):
            self.name = name
            # print('初始化物件')
    
        # 當設定屬性時會自動呼叫
        def __setattr__(self, key, value):
            # print(key, value)
            self.__dict__[key] = value
    
        # 當獲取不存在的屬性時會自動觸發
        def __getattr__(self, item):
            if item == 'age':
                return 18
            else:
                return '你猜'
    
        # 銷燬物件的指定屬性時會自動觸發
        def __delattr__(self, item):
            print(item, '屬性即將銷燬')
            
            
    xiaoming = Person('小明')
    # xiaoming.name = '小明'
    
    print(xiaoming.age)
    print(xiaoming.height)
    
    print(xiaoming.__dict__)
    
    del xiaoming.name
    print('over')
    
  • __setitem__、__getitem__、__delitem__

    class Person:
          # 將物件當做字典操作,新增或設定屬性時自動觸發
          def __setitem__(self, key, value):
              # print(key, value)
              self.__dict__[key] = value
    
          # 將物件當做字典操作,根據鍵獲取值時會自動觸發
          def __getitem__(self, item):
              # print(item)
              return self.__dict__.get(item)
    
          # 將物件當做字典操作,根據鍵銷燬屬性時會自動觸發
          def __delitem__(self, key):
              print(key, '屬性即將銷燬')
              del self.__dict__[key]
                
    xiaoming = Person()
    # xiaoming.name = '小明'
    # print(xiaoming.name)
    
    xiaoming['name'] = '小明'
    print(xiaoming['name'])
    
    del xiaoming['name']
    print(xiaoming['name'])            
    
  • __call__

    class Person:
          # 將物件當做函式呼叫,該方法會自動觸發
          def __call__(self, *args, **kwargs):
              # print('__call__', args)
              return sum(args)
            
    p = Person()
    # 將物件當做函式呼叫,必須重寫類的call方法
    ret = p(1, 2, 3)
    print(ret)
    
    def test():
    	pass
    
    # 判斷一個物件是否可以呼叫
    print(callable(p))
    print(callable(test))
    
    # 判斷一個物件是否是函式
    from inspect import isfunction
    print(isfunction(p))
    print(isfunction(test))
    
    # 判斷物件是否擁有指定屬性,若物件可以呼叫,那麼一定擁有__call__屬性
    print(hasattr(p, '__call__'))
    print(hasattr(test, '__call__'))