對於一些自學python的讀者來說,從面向對象開始已經算是基礎部分的知識學完了,那麼接下來就是深入的去瞭解和學習面向對象,它能夠使得我們所寫的代碼清晰合理,我在這裡將自己整理的筆記和python愛好者分享,有的地方寫的不好還請大家多多指教! ...
一.面向對象初識
1.1 面向過程編程vs函數式編程
我們在沒有學習函數的時候,寫的代碼都是面向過程式編程
# 面向過程編程 測量對象的元素的個數。
s1 = 'fjdsklafsjda'
count = 0
for i in s1:
count += 1
l1 = [1,2,3,4]
count = 0
for i in l1:
count += 1
在我們學習函數後就是在面向函數編程
def func(s):
count = 0
for i in s:
count += 1
return count
func('fdsafdsa')
func([1,2,3,4])
通過對比可知:函數編程較之面向過程編程最明顯的兩個特點:
(1)減少重覆的代碼
(2)增強代碼的可讀性
二.面向對象初識
2.1 函數式編程vs面向對象編程
函數式編程
# 函數式編程
# auth 認證相關
def login():
pass
def regisgter():
pass
# account 賬戶相關
def func1():
pass
def func2():
pass
# 購物車相關
def shopping(username,money):
pass
def check_paidgoods(username,money):
pass
def check_unpaidgoods(username,money):
pass
def save(username,money):
pass
面向對象編程
class LoginHandler:
def login(self):
pass
def regisgter(self):
pass
class Account:
def func1(self):
pass
def func2(self):
pass
class ShoppingCar:
def shopping(username,money):
pass
def check_paidgoods(username,money):
pass
def check_unpaidgoods(username,money):
pass
def save(username,money):
pass
面向對象優點:
1.結構清晰,可讀性高
2.上帝思維(慢慢體會)
什麼是對象?什麼是類?
類:對一些事物的統稱和概括
對象:實實在在存在的東西,具有特征和功能
2.2 類的結構
class Human:
"""
此類主要是構建人類
"""
mind = '有思想' # 第一部分:靜態屬性 屬性 靜態變數 靜態欄位
dic = {}
l1 = []
def work(self): # 第二部分:方法 函數 動態屬性
print('人類會工作')
class 是關鍵字與def用法相同,定義一個類。
Human是此類的類名,類名使用駝峰(CamelCase)命名風格,首字母大寫,私有類可用一個下劃線開頭。
類的結構從大方向來說就分為兩部分:
靜態變數。
動態方法。
三. 從類名的角度研究類
3.1 類名操作靜態屬性
第一種,查看類中的所有內容:類名.__dict__方式。
class Human:
"""
此類主要是構建人類
"""
mind = '有思想' # 第一部分:靜態屬性 屬性 靜態變數 靜態欄位
dic = {}
l1 = []
def work(self): # 第二部分:方法 函數 動態屬性
# print(self)
print('人類會工作')
print(Human.__dict__)
以下瞭解:
print(Human.__dict__['mind'])
Human.__dict__['mind'] = '無腦' # 錯誤
#通過這種方式只能查詢,不能增刪改.
print(Human.__dict__)
第二種:萬能的點.
class Human:
"""
此類主要是構建人類
"""
mind = '有思想' # 第一部分:靜態屬性 屬性 靜態變數 靜態欄位
dic = {}
l1 = []
def work(self): # 第二部分:方法 函數 動態屬性
# print(self)
print('人類會工作')
print(Human.mind) # 查
Human.mind = '無腦' # 改
print(Human.mind)
del Human.mind # 刪
Human.walk = '直立行走'
print(Human.walk)
# 通過萬能的點 可以增刪改查類中的單個屬性
**對以上兩種做一個總結:如果想查詢類中的所有內容,通過 第一種__dict__方法,如果只是操作單個屬性則用萬能的點的方式。**
2.2 類名操作動態方法
前提:除了兩個特殊方法:屬性,類方法之外,一般不會通過類名操作一個類中的方法。
class Human:
"""
此類主要是構建人類
"""
mind = '有思想' # 第一部分:靜態屬性 屬性 靜態變數 靜態欄位
dic = {}
l1 = []
def work(self): # 第二部分:方法 函數 動態屬性
# print(self)
print('人類會工作')
def tools(self):
print('人類會使用工具')
Human.work(111)
Human.tools(111)
下麵可以做,但不用。
Human.__dict__['work'](111)
四. 從對象的角度研究類
4.1 什麼是對象
對象是從類中出來的,只要是類名加上(),這就是一個實例化過程,這個就會實例化一個對象。
執行下列代碼會發生什麼事情?
class Human:
mind = '有思想'
def work(self):
print('人類會工作')
def tools(self):
print('人類會使用工具')
obj = Human() # 實例化對象
print(obj) # <__main__.Human object at 0x00000191508AA828>
其實實例化一個對象總共發生了三件事:
1,在記憶體中開闢了一個對象空間。
2,自動執行類中的__init__方法,並將這個對象空間(記憶體地址)傳給了__init__方法的第一個位置參數self。
3,在__init__ 方法中通過self給對象空間添加屬性。
示例:
class Human:
mind = '有思想'
language = '使用語言'
def __init__(self,name,sex,age,hobby):
# self 和 obj 指向的是同一個記憶體地址同一個空間,下麵就是通過self給這個對象空間封裝四個屬性。
self.n = name
self.s = sex
self.a = age
self.h = hobby
obj = Human('meet','男',18,'運動')
3.2 對象操作對象空間屬性
對象查詢對象中所有屬性。 對象.__dict__
class Human:
mind = '有思想'
language = '實用語言'
def __init__(self,name,sex,age,hobby):
# self 和 obj 指向的是同一個記憶體地址同一個空間,下麵就是通過self給這個對象空間封裝四個屬性。
self.n = name
self.s = sex
self.a = age
self.h = hobby
obj = Human('meet','男',18,'運動')
print(obj.__dict__) # {'n': 'meet', 'h': '運動', 's': '男', 'a': 18}
對象操作對象中的單個屬性。 萬能的點 .
class Human:
mind = '有思想'
language = '實用語言'
def __init__(self,name,sex,age,hobby):
# self 和 obj 指向的是同一個記憶體地址同一個空間,下麵就是通過self給這個對象空間封裝四個屬性。
self.n = name
self.s = sex
self.a = age
self.h = hobby
obj = Human('meet','男',18,'運動')
obj.job = 'IT' # 增
del obj.n # 刪
obj.s = '女' # 改
print(obj.s) # 查
print(obj.__dict__)
4.3 對象查看類中的屬性
class Human:
mind = '有思想'
language = '實用語言'
def __init__(self,name,sex,age,hobby):
self.n = name
self.s = sex
self.a = age
self.h = hobby
obj = Human('meet','男',18,'運動')
print(obj.mind)
print(obj.language)
obj.a = 666
print(obj.a)
4.4 對象操作類中的方法
class Human:
mind = '有思想'
language = '實用語言'
def __init__(self,name,sex,age,hobby):
self.n = name
self.s = sex
self.a = age
self.h = hobby
def work(self):
print(self)
print('人類會工作')
def tools(self):
print('人類會使用工具')
obj = Human('meet','男',18,'運動')
obj.work()
obj.tools()
類中的方法一般都是通過對象執行的(除去類方法,靜態方法外),並且對象執行這些方法都會自動將對象空間傳給方法中的第一個參數self.
4.5 self 是什麼?
self其實就是類中方法(函數)的第一個位置參數,只不過解釋器會自動將調用這個函數的對象傳給self。所以咱們把類中的方法的第一個參數約定俗成設置成self, 代表這個就是對象.這個self可以進行改變但是不建議大家進行修改
傳參分為隱式傳參和顯示傳參,self這種方式就是隱式傳參
4.6 一個類可以實例化多個對象
obj1= Human('小胖','男',20,'美女')
obj2= Human('相爺','男',18,'肥女')
print(obj1,obj2)
print(obj1.__dict__)
print(obj2.__dict__)
我們每實例化一個對象都開闢一個空間,並且這寫空間之間是獨立的.
實例:
class Person: # class 類名: 類名使用駝峰體
animal = "高級動物" # 靜態屬性(類變數,靜態欄位),此處為類中對象共有的屬性
soul = "有靈魂"
language = "語言"
def __init__(self, nation, name, sex, age, height): #初始化(給創建的對象封裝獨有屬性)
self.nation = nation # 點後邊的是變數名,可以起任意變數名
self.name = name
self.sex = sex
self.age = age
self.height = height
def eat(self): # 方法
print(f"{self.name}在吃飯")
def sleep(self):
pass
def work(self):
pass
p1 = Person("中國", "黃曉明", "未知", "42", "175") # 實例化一個對象
p2 = Person("加拿大", "皮特", "男", "60", "150")
p1.eat() #類名() 創建對象
p2.eat()
print(p1.animal)
結果:黃曉明在吃飯
皮特在吃飯
高級動物