Python学习记录之-----类
面向過程 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, 就是程序從上到下一步步執行,一步步從上到下,從頭到尾的解決問題 ?;驹O計思路就是程序一開始是要著手解決一個大的問題,然后把一個大問題分解成很多個小問題或子過程,這些子過程再執行的過程再繼續分解直到小問題足夠簡單到可以在一個小步驟范圍內解決。
???????????
面向對象編程
OOP編程是利用“類”和“對象”來創建各種模型來實現對真實世界的描述,使用面向對象編程的原因一方面是因為它可以使程序的維護和擴展變得更簡單,并且可以大大提高程序開發效率 ,另外,基于面向對象的程序可以使它人更加容易理解你的代碼邏輯,從而使團隊開發變得更從容。
面向對象的幾個核心特性如下
Class 類
一個類即是對一類擁有相同屬性的對象的抽象、藍圖、原型。在類中定義了這些對象的都具備的屬性(variables(data))、共同的方法?
Object 對象?
一個對象即是一個類的實例化后實例,一個類必須經過實例化后方可在程序中調用,一個類可以實例化多個對象,每個對象亦可以有不同的屬性,就像人類是指所有人,每個人是指具體的對象,人與人之前有共性,亦有不同
Encapsulation 封裝
在類中對數據的賦值、內部調用對外部用戶是透明的,這使類變成了一個膠囊或容器,里面包含著類的數據和方法
Inheritance 繼承
一個類可以派生出子類,在這個父類里定義的屬性、方法自動被子類繼承
Polymorphism 多態
多態是面向對象的重要特性,簡單點說:“一個接口,多種實現”,指一個基類中派生出了不同的子類,且每個子類在繼承了同樣的方法名的同時又對父類的方法做了不同的實現,這就是同一種事物表現出的多種形態。
編程其實就是一個將具體世界進行抽象化的過程,多態就是抽象化的一種體現,把一系列具體事物的共同點抽象出來, 再通過這個抽象的事物, 與不同的具體事物進行對話。
對不同類的對象發出相同的消息將會有不同的行為。比如,你的老板讓所有員工在九點鐘開始工作, 他只要在九點鐘的時候說:“開始工作”即可,而不需要對銷售人員說:“開始銷售工作”,對技術人員說:“開始技術工作”, 因為“員工”是一個抽象的事物, 只要是員工就可以開始工作,他知道這一點就行了。至于每個員工,當然會各司其職,做各自的工作。
多態允許將子類的對象當作父類的對象使用,某父類型的引用指向其子類型的對象,調用的方法是該子類型的方法。這里引用和調用方法的代碼編譯前就已經決定了,而引用所指向的對象可以在運行期間動態綁定
?
二、類的使用
1、屬性 又叫成員變量;方法(動態屬性)
class Dog(object):def __init__(self, name):self.name = nameself.__heart = 'Normal' #私有屬性def sayhi(self):print("hi ", self.name)def get_heart(self): # 定義私有屬性訪問接口return self.__heartd = Dog('CC') print(d.name) d.sayhi() print(d.get_heart()) #print(d.__heart) # AttributeError: 'Dog' object has no attribute '__heart' print(d._Dog__heart) #強制訪問私有屬性運行結果:
CC
hi CC
Normal
Normal
?類的執行過程:
?1、解析Dog類、及類的方法
2、實例化d得到一個內存地址,__init__() 構造函數初始化d
3、d.sayhi(), 會傳一個參數d給 sayhi(self), self=d
借老師的圖:
?
?
?2、公有屬性:在類里直接定義的屬性就叫公有屬性
?
# -*- encoding:utf8 -*- class Dog(object):nationality = "JP" # 公有屬性def __init__(self, name):self.name = nameself.__heart = 'Normal' # 私有屬性def sayhi(self): # 每個實例共享這些方法print("hi ", self.name)def get_heart(self): # 定義私有屬性訪問接口return self.__heartd = Dog('CC') print(d.name) d.sayhi() print(d.get_heart()) # print(d.__heart) # AttributeError: 'Dog' object has no attribute '__heart' print(d._Dog__heart) # 強制訪問私有屬性 d2 = Dog("CC2") print(d.nationality, d2.nationality) #JP JP d.nationality = "Tailand" print(d.nationality, d2.nationality) #Tailand JP ###公有屬性的修改 Dog.nationality = "China" print(d.nationality, d2.nationality) # Tailand China del(d.nationality) print(d.nationality, d2.nationality) # China China?程序運行結果:
CC
hi CC
Normal
Normal
JP JP
Tailand JP
Tailand China
China China
?
程序運行時,類及類的成員等會占用內存、實例對象占用內存(d.nationality==>Dog.nationality)如果d.nationality="",則下次調用時優先訪問d的nationality,如果del(d.nationality),此時調用則訪問Dog.nationality, ?調用時先調用自己的、若沒用再去找父類的
?
?3、析構函數
1 class Persion(): 2 def __init__(self, name): 3 self.name = '' 4 print("Father's init ") 5 def talk(self): 6 print("Persion Talk", self.name) 7 8 9 class BlackPersion(Persion): 10 # 繼承的屬性和方法在調用時先找自己的,沒有則繼續在父類中查找 11 # 子類定義了構造,若要構造父類,則需要顯示調用 12 def __init__(self, name): 13 print("Son's init") 14 #self.name = name 15 Persion.__init__(self, name) ##顯示調用父類構造函數 16 17 def walk(self): 18 #Persion.__init__(self, self.name) 19 print("black walk:", self.name) 20 21 b = BlackPersion(name="Lily") 22 23 b.walk() 24 b.talk()Son's init
Father's init
black walk:
Persion Talk
?
子類沒有構造方法時,程序會隱式的調用父類構造方法
?4、繼承 :?
#-*- encoding:utf8 -*- #Fuliaoclass SchoolMember(object):#父類member = 0def __init__(self, name, sex, age):self.name = nameself.sex = sexself.age = ageself.enroll()self.type = "Base class"def enroll(self):#registerprint("just enrolled a new school member [%s]" % self.name)SchoolMember.member += 1def tell(self):print('------%s info ----' % self.name)def __del__(self): # 刪除類實例對象名時調用、結束類時調用print("開除了 [%s]..." % self.name)SchoolMember.member -= 1def tell(self):print("----info: %s ----" % self.name)for k,v in self.__dict__.items(): # 類自帶字典格式 所有的屬性,包括子類父類print(k, v)class TeacherMember(SchoolMember):def __init__(self, name, age, sex, salary, course):SchoolMember.__init__(self, name, sex, age)self.salary = salaryself.course = course#self.enroll()def teaching(self):print("Teacher: [%s] is teaching [%s]" % (self.name, self.course))class Student(SchoolMember):# 繼承 優先調用自身def __init__(self, name, age, sex, course, tuition):SchoolMember.__init__(self, name, sex, age)self.course = courseself.tuition = tuition ## xue feiself.amount = 0#self.enroll()self.type = "son class"def pay_tuition(self, amount):print("student [%s] has just paied [%s]" % (self.name, amount))self.amount += amountdef tell(self):print("-----son's __dict__, ", self.name)for k, v in self.__dict__.items():print(k, v)t1 = TeacherMember("Chang", 16, "male", "20000", "Python") s1 = Student("AA", 23, "N/A", "pys13", 200000) s2 = Student("Lily", 13, "M", "pys13", 200000)print(t1.member, s1.member, s2.member) del s2 print(t1.member) print(t1.tell())程序結果:
just enrolled a new school member [Chang]
just enrolled a new school member [AA]
just enrolled a new school member [Lily]
3 3 3
開除了 [Lily]...
2
----info: Chang ----
sex male
age 16
salary 20000
type Base class
course Python
name Chang
None
開除了 [Chang]...
開除了 [AA]...
?
?三、封裝
什么是封裝? 在類中定義的屬性、方法等都是類的封裝
類中封裝了靜態字段(公有屬性)、方法。?
? 對象中封裝了啥?:封裝了普通屬性的值
class F1():def __init__(self, n):self.n = nprint("F1")class F2():def __init__(self, a):self.a = aprint("F2")class F3():def __init__(self, b):self.b = bprint("F3")o1 = F1("Wind") #o1.n = wind o2 = F2(o1) # o2.a = o1 o3 = F3(o2) #o3.b = o2print(o3.b.a.n) # Wind###封裝 對象?
?
?
?
?
?
轉載于:https://www.cnblogs.com/otcsnow/p/6359264.html
總結
以上是生活随笔為你收集整理的Python学习记录之-----类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [笔记]NumPy基础操作
- 下一篇: TCP/IP协议族(一) HTTP简介、