python-程式導向、物件導向、類
程式導向程式設計
前言:程式設計不就程式設計嗎?怎麼還有這麼多的洋氣詞字尾??今天主要介紹一下程式導向和麵向物件是什麼。
大白話版本:程式導向程式設計可以比作是做一道菜,那麼做一道菜分為幾步呢??
- 準備食材
- 起鍋燒油
- 放輔料
- 炒菜
- 出鍋
最高階的食材往往只需要最簡單的烹飪方式,呸,撤回來昂。這個過程,分佈來,按部就班的,一步一步的過程為程式導向。
如果還不理解的話,那麼想一想,把大象裝進冰箱需要幾步????,顯然是三步了,開啟冰箱把大象塞進去,關上冰箱!
- 程式導向程式設計其實也是一樣的,將程式設計要實現的目標,按步驟實現,每一步就是一個過程!
例項一:
# 做菜的步驟,通過程式導向程式設計實現
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']
'''通過整合,把資料和功能寫在一起,結果是一樣的'''
類和物件
二者區別
-
生活中
-
物件:特徵與技能的結合體
-
類:具有相似的特徵,相似的技能歸為一類,
-
例如:西瓜和哈密瓜可以歸為一水果類,
狗和貓可以歸為動物一類·····
-
強調:站在不同的分類角度,劃分的類可能不一樣,是先有物件,才有類的
-
-
程式中:
- 物件:資料和功能的結合體
- 類:具有相似資料,相似功能 的為一類
- 強調:必須先定義類,再呼叫類產生物件
定義格式:
-
定義函式
def 函式名():
pass
-
定義類:
class 類名():
pass
類比兩者記憶
定義類發生的事情
- 立即執行類內程式碼
- 產生一個類的名稱空間,把類內執行的名字都丟到名稱空間中(丟到大字典中)
- 把類的名稱空間繫結給__ 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']
- 注意:類中的方法,類可以呼叫,物件也可以呼叫, 但是,推薦物件來呼叫,因為物件來呼叫,會把自己當成第一個引數傳遞給函式