1. 程式人生 > >(D17)Python-面向物件程式設計

(D17)Python-面向物件程式設計

面向物件程式設計 Object Oriented Programming


兩種程式設計思想:

  • 面向過程程式設計
  • 面向過程思想:
    • 最小單位:函式 function
  • 面向物件程式設計:
    • 最小單位:類 class

什麼是物件?

  • 物件是指現實中的物體或者實體

什麼是面向物件?

  • 把一切看成物件(例項) 用各種物件之間的關係描述事物

物件都有什麼特徵?

  • 物件有很多屬性(名詞、形容詞)
  • 物件有很多行為(動作,動詞)

什麼是類?

  • 擁有相同屬性和行為的物件分為一組
  • 類是用來描述物件的工具

類的建立語句:

  • 語法:
    • class 類名(繼承列表):
      • ‘’‘ 類的文件字串’‘’
      • 例項方法(類的函式mothod)定義類的變數
      • 類方法(@classmethod)
      • 靜態方法(@ststicmethod)
    • 作用:
      • 建立一個類
      • 類用於描述物件屬性和行為
      • 類用於建立此類的一個或者多個物件
    • 說明:
      • 類名必須是標示符
      • 類名實質是一個變數

示例1:

class Dog:
    def eat(self,food):
        print('小狗正在吃',food)

dog1 = Dog()
dog1.eat('骨頭')


例項方法(instance merhod)

  • 定義格式:

    • class 類名(繼承列表):
      • def 示例方法名(self。引數1,引數2。。。)
        • 語句塊
    • 作用:
      • 用於描述一個物件的行為,讓此型別的全部物件都擁有相同的行為
    • 說明:
      • 例項方法的實質是函式,定義在內類的函式
      • 例項方法至少有一個形參,第一個形參代表呼叫這個方法的例項,一般命名為’self’

    例項方法的呼叫語法:
    例項.例項方法名(呼叫傳參):

    類名.例項方法名(例項,呼叫傳參)

示例2:

class Dog:
    def eat(self,food):
        print('小狗正在吃',food)
    def sleep(self,hour):
        print('吃完了要睡',hour,'小時')

dog1 = Dog()
dog1.eat('骨頭')
dog1.sleep('3')
dog2 = Dog()
dog2.sleep('5')

例項屬性:(attribute 例項變數)

  • 每個例項都可以用自己的變數來記錄每個物件自己的資料,把這個變數稱為例項變數
  • 使用語法:
    • 例項.屬性名
  • 賦值規則:
    • 首次屬性賦值擇建立此屬性
    • 再次賦值擇改變此屬性的繫結關係
  • 作用:
    • 記錄每個物件自身的資料

示例3:

class human:
    def set_info(self,name,age,address='不詳'):
        self.name = name
        self.age = age
        self.address =address

    def show_info(self):
        print(self.name,'今年',self.age,'歲','家住',self.address)



s1 = human()
s1.set_info('小張',20,'北京市東城區')
s2 = human()
s2.set_info('小李','18')
s1.show_info()
s2.show_info()

刪除屬性:

  • del 物件.例項變數名

del語句總結:

  • 1)刪除變數
  • 2)刪除列表中的元素
  • 3)刪除字典中的鍵
  • 4)刪除屬性

初始化方法

  • 作用:
    • 物件建立的物件新增屬性
  • 語法格式:
    • class 類名
      • def__init__(self[,形參列表])
        • 語句塊
    • 說明:
      • 初始化方法得名必須是‘init’不可改變
      • 初始化方法會在建構函式 建立例項後自動呼叫且將例項自身通過飛一個引數self傳入‘init’方法
      • 建構函式的實參將通過__init__方法的引數列表傳入到init方法中
      • 初始化方法內如果需要return語句返回擇只能返回none

示例4:

class student:
    def __init__(self,name,age,sorce=0):
        self.name = name
        self.age = age
        self.sorce = sorce 
    def set_sorce(self,sorce):
        if 0 <= sorce <= 100:
            self.sorce = sorce
        else:
            print('不在範圍內')

    
    def show_info(self):
        print(self.name,'今年',self.age,'歲','成績',self.sorce)


L = []
L.append(student('小張',20,100))
L.append(student('小李',18,95))
L.append(student('小錢',20))
L[-1].set_sorce(70)
for s in L:
    s.show_info()

析構方法:

  • 格式:
    • class 類名(繼承列表)
      • def del(self):
        • 。。。
  • 作用:
    • 在此物件銷燬前釋放次物件佔用的資源
  • 說明:
    • 析構方法會在物件銷燬時自動呼叫
    • python 語句建議不要在物件銷燬時做任何事情,因為銷燬時間難以確定

示例5:

class Car:
    def __init__(self, name):
        self.name = name
        print("汽車", name, '物件被建立')
 
    def __del__(self):
        print("汽車", self.name, '物件被銷燬')
 
c1 = Car("BYD E6")
# del c1
# L = []

預置的例項屬性

dict 屬性

  • __dict__屬性繫結一個儲存此例項自身變數的字典

示例6:

  class Dog:
      pass

  dog1 = Dog()
  print(dog1.__dict__)  # {}
  dog1.color = "白色"
  print(dog1.__dict__)  # {'color':'白色'}

__class__屬性

  • __class__屬性繫結建立此例項的類
  • 作用:
    • 可以藉助此屬性來訪問建立此例項的類

示例7:

class Dog:
    pass
dog1 = Dog()
print(dog1.__class__)
dog2 = dog1.__class__()
print(dog2.__class__)

用於類的函式:

  • isinstance (obj,class_or_tuple)
    • 返回這個物件obj是否是類的物件,或者某些類中的一個類物件
    • 如果是則返回True,否則返回Flase
  • type(obj) 返回物件的類

綜合練習


有兩個人:
    1.  姓名:張三
        年齡:35歲
    2.  姓名:李四
        年齡:8歲
行為:
    1.教別人學東西  teach
    2.工作賺錢  work
    3.借錢  borrow
用程式描述如下事情:
    張三  教  李四  學  python
    李四  教  張三  學  滑冰
    張三  上班  賺了  1000元錢
    李四  向  張三  借了  200元錢
    顯示李四的全部資訊
    顯示張三的全部資訊

程式碼:


class Human:
    def __init__(self, name, age):
        self.name = name  # 姓名
        self.age = age  # 年齡
        self.money = 0  # 錢數
        self.skill = []  # 技能
 
    def teach(self, other, skl):
        other.skill.append(skl)  # other得到了技能
        print(self.name, '正在教', other.name,
              '學', skl)
 
    def work(self, money):
        self.money += money
        print(self.name, '上班賺了', money, '元錢')
 
    def borrow(self, other, money):
        '''借錢成功返回True,失敗返回False'''
        # 先判斷other有沒有錢借
        if other.money > money:
            other.money -= money
            self.money += money
            print(other.name, '借給了',
                  self.name, money, '元錢')
            return True
        print(other.name, '沒借給', self.name)
        return False  # 借錢失敗
 
    def show_info(self):
        print(self.age, "歲的", self.name,
            '有技能:', self.skill, ',錢包內的錢數是',
            self.money)
 
zhang3 = Human("張三", 35)
li4 = Human('李四', 8)
zhang3.teach(li4, 'python')
li4.teach(zhang3, '滑冰')
 
zhang3.work(1000)  # 張三 上班 賺了 1000元錢
li4.borrow(zhang3, 200)  # 李四 向 張三 借了 200元錢
 
zhang3.show_info()
li4.show_info()