python-程式導向、物件導向、類

HammerZe發表於2021-12-02

python-程式導向、物件導向、類

image

程式導向程式設計

前言:程式設計不就程式設計嗎?怎麼還有這麼多的洋氣詞字尾??今天主要介紹一下程式導向和麵向物件是什麼。

大白話版本:程式導向程式設計可以比作是做一道菜,那麼做一道菜分為幾步呢??

  1. 準備食材
  2. 起鍋燒油
  3. 放輔料
  4. 炒菜
  5. 出鍋

最高階的食材往往只需要最簡單的烹飪方式,呸,撤回來昂。這個過程,分佈來,按部就班的,一步一步的過程為程式導向。

如果還不理解的話,那麼想一想,把大象裝進冰箱需要幾步????,顯然是三步了,開啟冰箱把大象塞進去,關上冰箱!

  • 程式導向程式設計其實也是一樣的,將程式設計要實現的目標,按步驟實現,每一步就是一個過程!
    image

例項一:

# 做菜的步驟,通過程式導向程式設計實現
def step1():
    print('第一步,準備食材')
def step2():
    print('第二步,起鍋燒油')
def step3():
    print('第一步,放輔料')
def step4():
    print('第一步,炒菜')
def step5():
    print('第一步,出鍋')

def mainstep():
    step1()
    step2()
    step3()
    step4()
    step5()
    print('感謝老闆祝老闆生八個兒子')

mainstep()

#結果
第一步,準備食材
第二步,起鍋燒油
第一步,放輔料
第一步,炒菜
第一步,出鍋
感謝老闆祝老闆生八個兒子

例項二:

# 使用者註冊功能
'''
1.獲取使用者名稱和密碼
2.組織成固定的格式
3.檔案操作寫入檔案
'''

# 定義獲取使用者資訊函式
def get_info():
    username = input('please input your name>>>:').strip()
    pwd = input('please input your pwd>>>:').strip()
    if len(username) == 0 or len(pwd) == 0:
        print('your username or name is empty,please try again!')
        return
    else:
        user_id = {
            '1': 'admin',
            '2': 'user'
        }
        print(user_id)
        choice = input('please choice your position:')
        if choice == '1':
            id = user_id[choice]
            print('you are admin!')
        elif choice == '2':
            id = user_id[choice]
            print('you are user!')
    return make_info(username, pwd, id)

# 處理資訊格式
def make_info(username, pwd, id):
    data = f'{username}|{pwd}|{id}\n'
    return save_info(data)

# 儲存到檔案
def save_info(data):
    with open(r'user_info.txt', 'a', encoding='utf8') as f:
        f.write(data)
    print('sign success!')

# 呼叫主體函式
get_info()

# 結果
please input your name>>>:hammer
please input your pwd>>>:123
{'1': 'admin', '2': 'user'}
please choice your position:1
you are admin!
sign success!

牛逼定義:程式導向的程式設計把計算機程式視為一系列的命令集合,即一組函式的順序執行。為了簡化程式設計,程式導向把函式繼續切分為子函式,即把大塊函式通過切割成小塊函式來降低系統的複雜度


物件導向

前言:物件導向,此物件非彼物件,物件導向的核心在於“物件”二字。

大白話版本:物件導向可以理解為,做菜的過程我們創造了一個機器人,把食材準備好和步驟寫入機器人,那麼可以理解為食材是我們需要的“資料”,如何做菜的步驟理解為“功能”,這個就是物件導向,總的來說就是定義出一系列的功能來對資料進行操作

  • 檢視源影像
  • 程式中物件:物件是把資料和功能整合到一起的產物,或物件就是盛放資料與功能的容器
  • 現實生活中:物件就是特徵和技能的結合體

示例如下:

# 未學習物件導向前,所有資料和功能都是散開的
# 資料
name = 'HammerZe'
course = []
# 功能
def add_course(name,course):
    course.append('python')
    print(f"學生{name}選課{course}")
add_course(name,course)

# 結果
學生HammerZe選課['python']

這樣我們發現,如果有100個學生需要和格式化輸出結果怎麼辦?寫100次嗎?是不是非常的麻煩

# 升級版
def add_course(user_info,course):
    user_info['course'].append(course)
    print(f"學生{user_info['name']}選課{user_info['course']}")


user_info = {
    'name': 'HammerZe',
    'course':[],
    'add_course':add_course,
}

user_info['add_course'](user_info,'python')
# 結果
學生HammerZe選課['python']
'''通過整合,把資料和功能寫在一起,結果是一樣的'''

類和物件

二者區別

  • 生活中

    • 物件:特徵與技能的結合體

    • 類:具有相似的特徵,相似的技能歸為一類,

    • 例如:西瓜和哈密瓜可以歸為一水果類,

      狗和貓可以歸為動物一類·····

    • 強調:站在不同的分類角度,劃分的類可能不一樣,是先有物件,才有類的

  • 程式中:

    • 物件:資料和功能的結合體
    • 類:具有相似資料,相似功能 的為一類
    • 強調:必須先定義類,再呼叫類產生物件

定義格式:

  1. 定義函式

    def 函式名():

    pass

  2. 定義類:

    class 類名():

    pass

    類比兩者記憶

定義類發生的事情

  1. 立即執行類內程式碼
  2. 產生一個類的名稱空間,把類內執行的名字都丟到名稱空間中(丟到大字典中)
  3. 把類的名稱空間繫結給__ dict __,類名 . __dict__檢視名稱空間

示例如下:

class Student():
    def add_course(user_info, course):
        user_info['course'].append(course)
        print(f"學生{user_info['name']}選課{user_info['course']}")
    print('呼叫類就會執行我!!')

# 檢視類的名稱空間
print(Student.__dict__)

# 產生物件:呼叫類的時候產生一個空物件{}
stu1 = Student()

# 檢視物件的名稱空間
print(stu1.__dict__)  # {}

定義類的標準格式

用學生類舉例

class Student():
    # 初始化
    def __init__(self,name,age):
        self.name = name # stu.__dict__['name'] = 'Hammer'
        self.age = age

    '''注意:return 在這個方法中不能有返回值'''

    # 選課方法
    def choose_course(stu_dict,course):
        stu_dict['course'].append(course)
        print(f"學生{stu_dict['name']}選課{course}")


stu = Student('HammerZe',18)
'''1.呼叫類產生一個空物件
   2.呼叫了Student.__dict__(空物件,'HmmerZe',18)'''

# 檢視類的名稱空間
print(Student.__dict__)
# 檢視物件的名稱空間
print(stu.__dict__)# {'name': 'HammerZe', 'age': 18}
# 取值
print(stu.__dict__['name'])
print(stu.name)

屬性的查詢順序

  • 屬性的查詢:
    • 類屬性:在類中的屬性就稱為類屬性
    • 物件屬性:在物件自己的名稱空間中屬性就是物件屬性
    • 注意:
      • 屬性的查詢:先從自己的物件中查詢,然後在去產生物件的類中取找
        如果使用dict從物件的名稱空間獲取值,找不到會報錯
        使用.獲取值,在自己的名稱空間找不到會取類的名稱空間查詢

示例如下

class Student():
    # 初始化
    school = 'SH'

    def __init__(self, name, age,course = None):
        if course is None:
            course = []
        self.name = name  # stu.__dict__['name'] = 'Hammer'
        self.age = age
        self.course = course

    '''注意:return 在這個方法中不能有返回值'''

    # 選課方法
    def choose_course(self, course):
        self.course.append(course)
        print(f"學生{self.name}選課{self.course}")


stu = Student('HammerZe', 18)
'''1.呼叫類產生一個空物件
   2.呼叫了Student.__dict__(空物件,'HmmerZe',18)'''

''' 屬性的查詢:先從自己的物件中查詢,然後在去產生物件的類中取找
        如果使用__dict__從物件的名稱空間獲取值,找不到會報錯
        使用.獲取值,在自己的名稱空間找不到會取類的名稱空間查詢
'''
# 類的查詢
# 檢視名稱空間
print(Student.__dict__)
# 檢視值
print(Student.school)  # SH
# 檢視方法
print(Student.choose_course)
# 類的增加
Student.country = 'China'
print(Student.__dict__['country']) # China
# 類的修改
Student.school = 'BJ'
print(Student.__dict__['school']) # BJ
# 類的刪除
del Student.school
print(Student.__dict__.get('school')) # None
''' 底層為字典可以用get '''

# 物件的增刪查改
# 檢視名稱空間
print(stu.__dict__) # {'name': 'HammerZe', 'age': 18}
# 檢視值
print(stu.name) # HammerZe

# 修改值
stu.name = 'Ze'
print(stu.name) # Ze

# 增加值
stu.gender = 'male'
print(stu.__dict__) # {'name': 'Ze', 'age': 18, 'gender': 'male'}

# 刪除值
del stu.gender
print(stu.__dict__) # {'name': 'Ze', 'age': 18}


# 方法的呼叫
# 類呼叫
Student.choose_course(stu,'python') # 學生Ze選課['python']
# 物件呼叫
stu.choose_course('java') # 學生Ze選課['python', 'java']
  • 注意:類中的方法,類可以呼叫,物件也可以呼叫, 但是,推薦物件來呼叫,因為物件來呼叫,會把自己當成第一個引數傳遞給函式

image

相關文章