python 物件導向

打工人發表於2021-09-12

程序導向與物件導向

程序導向程式設計

程序導向(procedural programming)就是程式從上到下一步步執行,從頭到尾的解決問題,如果你只是寫一些簡單的指令碼,去做一些一次性任務,用程序導向的方式最好

物件導向程式設計

物件導向(object-oriented Programming,簡稱 OOP)是利用 類 和 物件 來建立各種模型來實現對真實世界的描述,使用物件導向程式設計的原因 一方面是因為它可以使程式的維護和擴充套件變得更簡單,並且可以大大提高程式開發效率

Class 類

類是一類具有相同屬性和方法的集合

Object 物件

一個物件即是一個類的例項化後例項,一個類必須經過例項化後方可在程式中呼叫,一個類可以例項化多個物件,每個物件可以有不同的屬性,就像人類是指所有人,每個人是具體的物件,人與人之間由共性,亦有不同

Encapsulation 封裝

在類中對資料的賦值、內部呼叫對外部使用者是透明的,這使類變成了一個膠囊或容器,裡面保護著類的資料和方法
封裝的優點:減少耦合;類內部的結構可以自由修改;對成員變數進行更精確的控制;隱藏實現細節

Inheritance 繼承

一個類可以派生出子類,在這個父類裡定義的屬性、方法自動被子類繼承,繼承分為 單繼承和多繼承
繼承的優點:增加了類的耦合性;減少了重複程式碼;使得程式碼更加規範化、合理化

Polymorphism 多型

一個基類中派生出了不同的子類,且每個子類在繼承了同樣的方法名的同時又對父類的方法做了不同的實現,這就是同一種事物表現出的多種形態
封裝和繼承的目的是為了實現程式碼的複用,而多型是為了實現介面重用,使得類在繼承和派生的時候能夠保證任何一個類的例項都能正確呼叫約定好的屬性和方法

物件導向 vs 程序導向總結

  • 程序導向的程式設計的核心是過程(流水線式思維),過程即解決問題的步驟
    • 優點:極大的降低了寫程式的複雜度,只需要順序寫,堆疊程式碼即可
    • 缺點:一套流水線或者流程就是用來解決一個問題,程式碼牽一髮而動全身
  • 物件導向的程式設計的核心是物件
    • 優點:解決了程式的擴充套件性。對某一個物件單獨修改,會立刻反映到整個體系中
    • 缺點:可控性差,無法向程序導向的程式設計流水線式的可以很精準的預測問題的處理流程和結果,物件導向的程式一旦開始就由物件之間的互動解決問題

類的定義

class Dog:      # 類名首字母要大寫,駝峰體

    d_type = "京巴"   # 公共屬性,又稱類變數

    def __init__(self, name, age):      # 初始化函式,只要一例項化,就會自動執行
        self.name = name            # self.name 就是例項自己的變數
        self.age = age

    def say_hi(self):           # 類方法,必須帶一個self引數,代表例項本身
        # 想要呼叫類裡的屬性,都有加上self
        print("dog name is %s" % self.name)

d = Dog('maomao', 2)    # 生成一個狗的例項
d2 = Dog('dandan', 3)

d.say_hi()      # 呼叫類方法
d2.say_hi()

print(d.name, d.age)        # 呼叫例項的變數
print(d.d_type)             # 呼叫類的變數

# 屬性的增刪改查
class Person:
    nationality = "chinese"
    addr = "北京"

    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex


# 例項屬性操作
p = Person('Alex', 20, 'Male')
p.name = 'Bob'      # 修改屬性
p.job = 'CEO'       # 新增例項屬性
del p.sex           # 刪除例項屬性
print(p.job)        # 列印新增的例項屬性

# 類屬性操作
Person.nationality = "USA"  # 類屬性修改
Person.race = "Yellow"      # 類屬性新增
del Person.addr             # 刪除類屬性
print(p.addr)               # 再呼叫已刪除的類屬性就會報錯

相關文章