一、面向程序編程VS面向物件編程
面向程序編程:
核心是程序二字,程序是解決問題的步驟,即先干啥再干啥后干啥
基于該思想寫程式就是在設計一條條的流水線
優點:復雜的問題流程化、進而簡單化
缺點:擴展性差
面向物件編程:
核心是物件二字,物件是一個用來盛放資料與功能的容器
基于該思想寫程式就是在整合程式
優點:可擴展性強
缺點:編程的復雜度高
軟體不止于面向物件程式設計(解決可擴展性),還有其他方方面面

二、如何基于面向物件的思想寫程式
面向物件三大特性:繼承,封裝,多型
# 例1 # 學生的資料 stu_name = "egon" stu_age = 18 stu_gender = "male" # 學生的功能 def choose(name, age, gender): print('%s:%s:%s 正在選課' % (name, age, gender)) choose(stu_name,stu_age,stu_gender)
# 例2:基于物件式的思想進行改寫 def choose(stu_self): print('%s:%s:%s 正在選課' % (stu_self["stu_name"], stu_self["stu_age"],stu_self["stu_gender"],)) stu_obj = { "stu_name": "egon", "stu_age": 18, "stu_gender": "male", "choose":choose } print(stu_obj["stu_name"]) stu_obj["choose"](stu_obj)
python提供專門的語法來更漂亮地實作面向物件編程
''' 學生物件1 資料: 名字 = "馮瘋子" 年齡 = 18 性別 = "female" 學生物件2 資料: 名字 = "郭靖" 年齡 = 19 性別 = "male" 學生物件3 資料: 名字 = "大雕" 年齡 = 200 性別 = "male" 學生的類 相同的資料 學校 = "oldboy" 相同的功能 選課 '''
三、初始化方法
物件是特征與技能的結合體,而類則是一系列物件相似的特征與技能的結合體
物件是用來存放資料與功能的容器,那么類則是用來存放多個物件相同的資料與功能的容器,
在程式中:務必保證先定義類,后產生物件
呼叫函式會執行函式體代碼回傳的是函式體執行的結果,而呼叫類會產生物件,回傳的是物件
#例1 # 類體代碼會在類定義階段立刻執行,然后將產生的名字都丟到類的名稱空間中 class Student: # 相同的資料 school = "oldboy" # 相同的功能 def choose(self): print("正在選課") # print('====>') stu_obj1=Student() stu_obj2=Student() stu_obj3=Student() stu_obj1.name = "馮瘋子" # stu1_obj1.__dict__["name"] = "馮瘋子" stu_obj1.age = 18 stu_obj1.gender = "female" stu_obj2.name = "郭靖" stu_obj2.age = 19 stu_obj2.gender = "male" stu_obj3.name = "大雕" stu_obj3.age = 200 stu_obj3.gender = "male" print(stu_obj1.name) #馮瘋子 stu_obj1.school = "xxx"#重新賦值 print(stu_obj1.school) #xxx # print(Student.__dict__) print(stu_obj1.__dict__)#{'name': '馮瘋子', 'age': 18, 'gender': 'female', 'school': 'xxx'} print(stu_obj2.__dict__)#{'name': '郭靖', 'age': 19, 'gender': 'male'} print(stu_obj3.__dict__)#{'name': '大雕', 'age': 200, 'gender': 'male'}
#例2
class Student: school = "oldboy" def choose(self): print("正在選課") print('===>') stu_obj1 = Student() stu_obj2 = Student() stu_obj3 = Student() def init(obj, x, y, z): obj.name = x obj.age = y obj.gender = z init(stu_obj1, "馮瘋子", 18, "female") init(stu_obj2, "郭靖", 19, "male") init(stu_obj3, "大雕", 200, "male") print(stu_obj1.__dict__) print(stu_obj2.__dict__) print(stu_obj3.__dict__)
class Student: school = "oldboy" # 空物件 def __init__(obj, x, y, z): obj.name = x obj.age = y obj.gender = z # return None # 只能回傳None,所以就不要寫return了 def choose(self): print("正在選課") # 呼叫類: # 1、創建一個空物件與類相關 # 2、把空物件、"馮瘋子", 18, "female"一起傳給__init__方法,完成物件的初始化 # 3、賦值符號把初始化好的物件的記憶體地址系結變數名stu_obj1 stu_obj1 = Student("馮瘋子", 18, "female") stu_obj2 = Student("郭靖", 19, "male") stu_obj3 = Student("大雕", 200, "male") print(Student.__dict__) print(stu_obj1.__dict__) print(stu_obj2.__dict__) print(stu_obj3.__dict__)
物件可以訪問到類中共有的資料與功能,所以類中的內容仍然是屬于物件的,類只不過是一種節省空間、減少代碼冗余的機制,面向物件編程最終的核心仍然是去使用物件,
.物件的屬性
=賦值
給了類名,類名可以點出來名稱空間的名字
四、屬性查找
# 優先級 # 先從物件的字典里找,沒有,再去類的字典中找 class Student: school = "oldboy" def __init__(obj, x, y, z): obj.name = x obj.age = y obj.gender = z def choose(self): print("%s 正在選課" %self.name) stu_obj1 = Student("馮瘋子", 18, "female") stu_obj2 = Student("郭靖", 19, "male") stu_obj3 = Student("大雕", 200, "male") # 1、類中定義的資料是直接共享給所有物件使用的 # print(id(stu_obj1.school))#地址相同 # print(id(stu_obj2.school))#地址相同 # print(id(stu_obj3.school))#地址相同 # print(id(Student.school))#地址相同 # Student.school="xxx" # print(stu_obj1.school)#xxx # print(stu_obj2.school)#xxx # print(stu_obj3.school)#xxx # print(Student.choose)#<function Student.choose at 0x00000000022DD430>地址不同 # print(stu_obj1.choose)#<bound method Student.choose of <__main__.Student object at 0x0000000001DC5A00>>地址不同 # print(stu_obj2.choose)#<bound method Student.choose of <__main__.Student object at 0x0000000001DDEA90>>地址不同 # print(stu_obj3.choose)#<bound method Student.choose of <__main__.Student object at 0x0000000001DDECD0>>地址不同 # 2、類中定義的函式是系結給所有物件用的,系結給誰就應該由哪個物件來呼叫 # 物件.系結方法()會把物件當作第一個引數傳入 # 類.函式()就是一個函式的玩法,沒有自動傳參的效果 Student.choose(123123123) stu_obj3.choose() stu_obj2.choose() stu_obj1.choose()
---24---
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/69458.html
標籤:Python
上一篇:re模塊(練習題)
下一篇:415字串相加
