日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第一章 面向对象编程

發布時間:2025/4/5 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第一章 面向对象编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

面向對象語法

attack_vals = {"京巴":30,"藏獒":80 } def dog(name,d_type): # 模板data ={"name":name,"d_type":d_type,# "attack_val":30,"life_val":100}if d_type in attack_vals:data["attack_val"] = attack_vals[d_type]else:data["attack_val"] = 15return datadef person(name,age):data = {"name":name,"age":age,"life_val":100}if age>18:data["attack_val"] =50else:data["attack_val"] =30return datadef dog_bite(dog_obj,person_obj):person_obj["life_val"] -= dog_obj["attack_val"] # 執行咬人動作print("狗[%s]咬了人[%s]一口,人掉血[%s],還有血量[%s]..."%(dog_obj['name'],person_obj['name'],dog_obj["attack_val"],person_obj["life_val"])) def beat(person_obj,dog_obj):dog_obj["life_val"] -= person_obj["attack_val"]print("人[%s]打了狗[%s]一棒,狗掉血[%s],還有血量[%s]..."%(person_obj["name"],dog_obj["name"],person_obj["attack_val"],dog_obj["life_val"])) d1 = dog("mjj","京巴") # 實體 d2 = dog("mjj2","藏獒") p1 = person("alex",22) dog_bite(d1,p1) beat(p1,d1) dog_bite(p1,d2) print(d1,d2) print(p1)

人是不應該調用狗的功能的,如何在代碼級別實現這個限制呢?

attack_vals = {"京巴":30,"藏獒":80 } def dog(name,d_type): # 模板data ={"name":name,"d_type":d_type,"life_val":100}if d_type in attack_vals:data["attack_val"] = attack_vals[d_type]else:data["attack_val"] = 15def dog_bite( person_obj):person_obj["life_val"] -= data["attack_val"] # 執行咬人動作print("狗[%s]咬了人[%s]一口,人掉血[%s],還有血量[%s]..." % (data['name'],person_obj['name'],data["attack_val"],person_obj["life_val"]))data["bite"] = dog_bite # 為了從函數外部可以調用這個dog_bite方法return datadef person(name,age):data = {"name":name,"age":age,"life_val":100}if age>18:data["attack_val"] =50else:data["attack_val"] =30def beat(dog_obj):dog_obj["life_val"] -= data["attack_val"]print("人[%s]打了狗[%s]一棒,狗掉血[%s],還有血量[%s]..." % (data["name"],dog_obj["name"],data["attack_val"],dog_obj["life_val"]))data["beat"] = beatreturn datad1 = dog("mjj","京巴") # 實體 d2 = dog("mjj2","藏獒") p1 = person("alex",22) d1["bite"](p1) # 咬人 d1["bite"](p1) # 咬人 d1["bite"](p1) # 咬人 p1["beat"](d1) # 打狗

?編程范式

編程是 程序 員 用特定的語法+數據結構+算法組成的代碼來告訴計算機如何執行任務的過程 , 一個程序是程序員為了得到一個任務結果而編寫的一組指令的集合,正所謂條條大路通羅馬,實現一個任務的方式有很多種不同的方式, 對這些不同的編程方式的特點進行歸納總結出來的編程方式類別,即為編程范式。 不同的編程范式本質上代表對各種類型的任務采取的不同的解決問題的思路, 大多數語言只支持一種編程范式,當然也有些語言可以同時支持多種編程范式。 兩種最重要的編程范式分別是面向過程編程和面向對象編程。

面向過程 VS 面向對象

面向過程編程(Procedural Programming)

Procedural programming uses a list of instructions to tell the computer what to do step-by-step.?
面向過程編程依賴 - 你猜到了- procedures,一個procedure包含一組要被進行計算的步驟, 面向過程又被稱為top-down languages, 就是程序從上到下一步步執行,一步步從上到下,從頭到尾的解決問題 。基本設計思路就是程序一開始是要著手解決一個大的問題,然后把一個大問題分解成很多個小問題或子過程,這些子過程再執行的過程再繼續分解直到小問題足夠簡單到可以在一個小步驟范圍內解決。

面向對象編程(Object-Oriented Programming)

OOP編程是利用“類”和“對象”來創建各種模型來實現對真實世界的描述,使用面向對象編程的原因一方面是因為它可以使程序的維護和擴展變得更簡單,并且可以大大提高程序開發效率 ,另外,基于面向對象的程序可以使它人更加容易理解你的代碼邏輯,從而使團隊開發變得更從容。

面向對象的幾個核心特性如下

Class 類
一個類即是對一類擁有相同屬性的對象的抽象、藍圖、原型。在類中定義了這些對象的都具備的屬性(variables(data))、共同的方法

Object 對象?
一個對象即是一個類的實例化后實例,一個類必須經過實例化后方可在程序中調用,一個類可以實例化多個對象,每個對象亦可以有不同的屬性,就像人類是指所有人,每個人是指具體的對象,人與人之前有共性,亦有不同

Encapsulation 封裝
在類中對數據的賦值、內部調用對外部用戶是透明的,這使類變成了一個膠囊或容器,里面包含著類的數據和方法

Inheritance 繼承
一個類可以派生出子類,在這個父類里定義的屬性、方法自動被子類繼承

Polymorphism 多態
多態是面向對象的重要特性,簡單點說:“一個接口,多種實現”,指一個基類中派生出了不同的子類,且每個子類在繼承了同樣的方法名的同時又對父類的方法做了不同的實現,這就是同一種事物表現出的多種形態。
編程其實就是一個將具體世界進行抽象化的過程,多態就是抽象化的一種體現,把一系列具體事物的共同點抽象出來, 再通過這個抽象的事物, 與不同的具體事物進行對話。
對不同類的對象發出相同的消息將會有不同的行為。比如,你的老板讓所有員工在九點鐘開始工作, 他只要在九點鐘的時候說:“開始工作”即可,而不需要對銷售人員說:“開始銷售工作”,對技術人員說:“開始技術工作”, 因為“員工”是一個抽象的事物, 只要是員工就可以開始工作,他知道這一點就行了。至于每個員工,當然會各司其職,做各自的工作。
多態允許將子類的對象當作父類的對象使用,某父類型的引用指向其子類型的對象,調用的方法是該子類型的方法。這里引用和調用方法的代碼編譯前就已經決定了,而引用所指向的對象可以在運行期間動態綁定

面向對象vs面向過程總結

面向過程的程序設計的核心是過程(流水線式思維),過程即解決問題的步驟,面向過程的設計就好比精心設計好一條流水線,考慮周全什么時候處理什么東西。

優點是:極大的降低了寫程序的復雜度,只需要順著要執行的步驟,堆疊代碼即可。

缺點是:一套流水線或者流程就是用來解決一個問題,代碼牽一發而動全身。

面向對象的程序設計的核心是對象(上帝式思維),要理解對象為何物,必須把自己當成上帝,上帝眼里世間存在的萬物皆為對象,不存在的也可以創造出來。面向對象的程序設計好比如來設計西游記,如來要解決的問題是把經書傳給東土大唐,如來想了想解決這個問題需要四個人:唐僧,沙和尚,豬八戒,孫悟空,每個人都有各自的特征和技能(這就是對象的概念,特征和技能分別對應對象的屬性和方法),然而這并不好玩,于是如來又安排了一群妖魔鬼怪,為了防止師徒四人在取經路上被搞死,又安排了一群神仙保駕護航,這些都是對象。然后取經開始,師徒四人與妖魔鬼怪神仙互相纏斗著直到最后取得真經。如來根本不會管師徒四人按照什么流程去取。

面向對象的程序設計的

優點是:解決了程序的擴展性。對某一個對象單獨修改,會立刻反映到整個體系中,如對游戲中一個人物參數的特征和技能修改都很容易。

缺點:可控性差,無法向面向過程的程序設計流水線式的可以很精準的預測問題的處理流程與結果,面向對象的程序一旦開始就由對象之間的交互解決問題即便是上帝也無法預測最終結果。于是我們經常看到一個游戲人某一參數的修改極有可能導致陰霸的技能出現,一刀砍死3個人,這個游戲就失去平衡。

應用場景:需求經常變化的軟件,一般需求的變化都集中在用戶層,互聯網應用,企業內部軟件,游戲等都是面向對象的程序設計大顯身手的好地方。

類的定義

?繼承

# coding=utf-8 class Animal:a_type = "哺乳動物"def __init__(self,name,age,sex):self.name = nameself.age = ageself.sex = sexprint("---父類的構造方法")def eat(self):print("%s is eating..."% self.name)class Person(Animal): # 繼承a_type = "哺乳高等動物"def __init__(self,name,age,sex,hobby):# Animal.__init__(self,name,age,sex)super(Person, self).__init__(name,age,sex) # 效果同上self.hobby = hobbyprint("---子類的構造方法")def talk(self):print("person %s is talking...." % self.name)def eat(self):Animal.eat(self) # 先執行父類再執行子類方法print("人在優雅的吃飯。。。") class Dog(Animal):def chase_rabbit(self):print("狗在追兔子。。。")p = Person("Alex",22,"M","女人") # 生成實例 p.eat() # 調用父類方法 p.talk() print(p.a_type) print(p.name,p.sex,p.hobby)d = Dog("Mjj",3,"Female") d.eat() d.chase_rabbit() # 調用子類自有的方法

校園管理系統

設計一個培訓機構管理系統,有總部、分校,有學員、老師、員工,實現具體如下需求:

1.有多個課程,課程要有定價

2.有多個班級,班級跟課程有關聯

3.有多個學生,學生報名班級,交這個班級對應的課程的費用

4.有多個老師,可以分布在不同校區,上不同班級的課

5.有多個員工,可以分布在不同校區在總部可以統計各校區的賬戶余額、員工人數、學員人數

6.學生可以轉校、退學

思路:

1,定模型,多少個類

1)找出關鍵獨立名詞:

  總部

  分校

  學員

  老師

  員工

  課程

  班級

2,定屬性

  總部:名稱、地址、電話、網址

     財務賬戶

     員工列表

     學員列表人數

     發工資

     開分校

     招人

  分校:

    pass

  學員:姓名、年齡、班級、余額

    上學打卡

    交學費

  老師:教學

  員工:姓名、職務、部門、工資?

  課程:名稱、大綱、價格

  班級:課程、學期、學員列表,校區

3,定關系

  分校---》總部

  學員--》班級

  班級--》校區

  老師--》班級

  老師--》員工

  學員--》老師

  員工--》校區

4,畫UML模型圖

  統一建模語言

5,寫代碼

# coding=utf-8 import datetimeclass School(object):"""總部學校類"""def __init__(self, name, addr, website):self.name = nameself.addr = addrself.website = websiteself.balance = 0self.branches = [] # 存所有分校對象self.class_list = [] # 存放班級列表self.staff_list = [] # 存放員工列表print("創建了校區[%s],地址[%s]" % (name, addr))def count_stu_num(self):passdef count_stuff_num(self):passdef staff_enrollment(self, staff_obj):self.staff_list.append(staff_obj)print("[%s]入職新員工[%s],職位[%s],部門[%s]"%(self.name,staff_obj.name,staff_obj.position,staff_obj.dept))def count_total_revenue(self):print("----校區總收入----")total_rev = self.balanceprint(self.name,self.balance)for b in self.branches:print(b.name,b.balance)total_rev += b.balanceprint("校區總收入:%s"%total_rev)def count_class_list(self):print("---各校區班級---")print(self.name,self.class_list)for i in self.branches:print(i.name, i.class_list)def pay_salary(self):print("開始發工資啦。。。")for i in self.staff_list:i.balance += i.salary # 發工資self.balance -= i.salary # 總部相應賬戶扣錢print("給%s發了%s,他的余額:%s"%(i.name,i.salary,i.salary))print("公司的余額",self.balance)def __str__(self):return self.namedef __repr__(self):return self.nameclass BranchSchool(School):"""分校"""def __init__(self,name,addr,website,headquarter_obj):super().__init__(name,addr,website)self.headquarter = headquarter_obj # 總部的對象self.headquarter.branches.append(self) # 把自己加入到總校的校區列表,建立總部---》分校的反向關聯class Course(object):"""課程類"""def __init__(self, name, price, outline):self.name = nameself.price = priceself.outline = outlineprint("創建了課程[%s],學費[%s]" % (name, price))class Class(object):"""班級"""def __init__(self, course_obj, semester, school_obj):self.course_obj = course_objself.semester = semesterself.school_obj = school_objself.stu_list = [] # 存放學員列表school_obj.class_list.append(self) # 把自己加到校區的班級列表print("校區[%s]創建了班級[%s],學期[%s]" % (school_obj.name, course_obj.name, semester))def stu_transfer(self, stu_obj, new_class_obj):"""學員轉校:param stu_obj: 學員對象:param new_class_obj: 轉到的新班級的對象:return:"""def __str__(self):return "%s-%s-%s學期" % (self.school_obj.name, self.course_obj, self.semester)def __repr__(self):return "%s-%s-%s學期" % (self.school_obj.name, self.course_obj, self.semester)class Staff(object):"""員工"""def __init__(self, name, age, balance, salary, position, dept, school_obj):self.name = nameself.age = ageself.balance = balanceself.salary = salaryself.position = positionself.dept = deptself.school_obj = school_objschool_obj.staff_enrollment(self) # 辦入職def punch_card(self):passclass Teacher(Staff):def __init__(self, name, age, balance, salary, position, dept, school_obj, course_obj):super().__init__(name, age, balance, salary, position, dept, school_obj)self.course_obj = course_obj # 老師可以講的課def teach_class(self, class_obj, day):print("老師[%s]正在班級[%s]上第[%s]天課ing" % (self.name, class_obj, day))class Student(object):"""學員"""def __init__(self, name, age, balance, class_obj):self.name = nameself.age = ageself.balance = balanceself.class_obj = class_obj# 加入班級class_obj.stu_list.append(self)# 交學費class_obj.school_obj.balance += class_obj.course_obj.priceself.balance -= class_obj.course_obj.priceprint("班級[%s]加入了新學員[%s],交了學費[%s]" % (class_obj, name, class_obj.course_obj.price))def punch_card(self):print("%s:學員在班級[%s]上課了...." % (datetime.datetime.now(), self.class_obj))# 創建校區 headquarter = School("老男孩IT教育集團", "北京昌平沙河", "oldboyedu.com") sh1_school = BranchSchool("張江校區", "上海張江", "oldboyedu.com",headquarter) sh2_school = BranchSchool("虹橋校區", "上海虹橋火車站", "oldboyedu.com",headquarter) sz1 = BranchSchool("騎士計劃", "深證大學城", "oldboyedu.com",headquarter) luffy = BranchSchool("路飛學城", "北京長安街", "luffycity.com",headquarter)# 創建課程 py_course = Course("Python",21800, None) linux_course = Course("linux", 19800, None) test_course = Course("Testing", 19800, None) go_course = Course("GO", 22800, None) # 創建班級 py_24 = Class(py_course, 24, headquarter) go_5 = Class(go_course, 5, headquarter) py_12 = Class(py_course, 12, sh1_school) linux_63 = Class(linux_course, 63, sz1)# 創建員工,老師,學員 s1 = Staff("Alex", 26, 0, 4000, "CEO", "總經辦", luffy) s2 = Staff("Todd", 45, 0, 60000, "CEO", "總經辦", headquarter) s3 = Staff("明月", 24, 0, 7000, "HR", "HR", headquarter)t1 = Teacher("日天", 28, 0, 30000, "講師", "教學部", sz1, py_course) t2 = Teacher("Egon", 28, 0, 30000, "講師", "教學部", sh1_school, go_course) t3 = Teacher("佩奇", 29, 0, 40000, "學科帶頭人", "教學部", headquarter, linux_course)stu1 = Student("春生", 22, 50000, py_24) stu2 = Student("black_girl", 22, 30000, go_5) stu3 = Student("小強", 22, 35000, go_5) stu4 = Student("小虎", 28, 38000, linux_63)print(headquarter.balance) print(sz1.balance) print(headquarter.branches) # 統計總收入,學員人數 headquarter.count_total_revenue() headquarter.count_class_list() headquarter.pay_salary() View Code

總結

以上是生活随笔為你收集整理的第一章 面向对象编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。