編程的兩個思想: 面向物件和面向程序
面向程序的程式設計的核心是程序(流水線式思維),程序即解決問題的步驟,面向程序的設計就好比精心設計好一條流水線,考慮周全什么時候處理什么東西,
優點是:極大的降低了寫程式的復雜度,只需要順著要執行的步驟,堆疊代碼即可,
缺點是:一套流水線或者流程就是用來解決一個問題,代碼牽一發而動全身,
應用場景:一旦完成基本很少改變的場景,著名的例子有Linux內核,git,以及Apache HTTP Server等,
面向物件的程式設計的核心是物件(上帝式思維),要理解物件為何物,必須把自己當成上帝,上帝眼里世間存在的萬物皆為物件,不存在的也可以創造出來
面向物件的優缺點:
優點是:解決了程式的擴展性,對某一個物件單獨修改,會立刻反映到整個體系中,如對游戲中一個人物引數的特征和技能修改都很容易,
缺點:可控性差,無法向面向程序的程式設計流水線式的可以很精準的預測問題的處理流程與結果,面向物件的程式一旦開始就由物件之間的互動解決問題,即便是上帝也無法預測最終結果,
應用場景:需求經常變化的軟體,一般需求的變化都集中在用戶層,互聯網應用,企業內部軟體,游戲等都是面向物件的程式設計大顯身手的好地方
兩者相輔相成,并不是對立的,都是為了解決問題的,
1. 類和物件
類是多個類似的事物組成的群體的統稱, 能夠幫助我們快速理解和判斷事物的性質,
類:具有相同特征的一類事物(人、狗、老虎,手機)
物件/實體:具體的某一個事物(你的同學張三、樓下的旺財)
實體化:類——>物件的程序
比如一說手機你就想到他的形狀,里面有收發短信,打電話的功能,也能上網, 但你能知道我說的手機在上哪個網站嗎?
不能,所以手機就是一個類,它具有相同的屬性和方法; 而具體的用手機做了什么,誰的手機,就是手機類的一個物件,
比如小米手機
Python中一切皆為物件,串列物件,數字物件
用變數表示特征,用函式表示技能,具有相同特征和技能的一類事物就是‘類’,物件是則是這一類事物中具體的一個,
2. 類的創建和撰寫
a) 定義一個類
語法:
class Student:
pass
類的組成:
- 類名的規范: 是由一個或者多個單詞組成的,要求每個單詞的首字母大寫,其余的小寫;
- Python中一切皆物件,需要開辟記憶體空間
# 作者:互聯網老辛
# 開發時間:2021/4/4/0004 6s
class Student:
pass
print(id(Student))
print(type(Student))
print(Student)

看到ID的數值,就知道這里的類是開辟了一塊記憶體空間,
案例1:學生類模板
# 作者:互聯網老辛
# 開發時間:2021/4/4/0004 6s
class Student:
native_pace='山東' # 直接寫在類里的變數,成為屬性 ,學生的地方屬性是山東
#實體方法: 在類之外定義稱為函式,在類之內定義成為方法
def __init__(self,name,age):
self.name=name
self.age=age #self.name稱為物體屬性,進行了一個復制操作,將區域變數name賦值給物體的屬性
def eat(self):
print('正在吃飯') # 這是一個方法,叫吃飯方法,也叫動態屬性
#靜態方法
@staticmethod
def method():
print('我使用了statticmethod進行修飾,所以我叫靜態方法')
@classmethod
#這種叫類方法
def cm(cls):
print('我是類方法,因為我使用了classmethod進行修飾')
通過這個案例來了解,靜態方法,實體方法,以及類方法和動態屬性
b) 創建物件
物件的創建又稱為類的實體化
語法: 實體名=類名()
類名+括號就是實體化,會自動觸發 _ init _函式運行,可以用它來為每個實體定制自己的特征,
# 作者:互聯網老辛
# 開發時間:2021/4/4/0004 6s
class Student:
native_pace='山東' # 直接寫在類里的變數,成為屬性
#實體方法: 在類之外定義稱為函式,在類之內定義成為方法
def __init__(self,name,age):
self.name=name
self.age=age #self.name稱為物體屬性,進行了一個復制操作,將區域變數name賦值給物體的屬性
def eat(self):
print('正在吃飯')
#靜態方法
@staticmethod
def method():
print('我使用了statticmethod進行修飾,所以我叫靜態方法')
@classmethod
#這種叫類方法
def cm(cls):
print('我是類方法,因為我使用了classmethod進行修飾')
## 創建Student的物件
stu1=Student('互聯網老辛',40)
stu1.eat()
print(stu1.name)
print(stu1.age)

實體化的程序就是: 類——>物件的程序,
我們原本只有一個Student類,產生了一個stu1物件,這個物件有自己的具體命令,年齡,以及吃飯的方法,
案例2
# 作者:互聯網老辛
# 開發時間:2021/4/4/0004 6s
class Person:
role='person' #角色的屬性是人
def __init__(self,name):
self.name = name #每個角色有一個自己的名字
def walk(self):
print("person can walking")
##實體化程序
p1=Person('張三') #類名()就相當于執行 Person.__init__()
#這里你可以理解為 p1={'name':'張三',’walk':'walk'}
print(p1.name) #查看屬性直接 物件名,屬性名
print(p1.walk()) # 呼叫方法, 物件名.方法名
大部分的注釋都寫在代碼里了,可以看代碼去理解
再給剛才的代碼增加功能,比如人不但可以走路還可以攻擊狗
class Person:
role='person' #角色的屬性是人
def __init__(self,name,aggressivity,life_value):
self.name = name #每個角色有一個自己的名字
self.aggressivity = aggressivity # 每個角色都有一個攻擊力
self.life_value = life_value #每個角色都有一個生命值
def walk(self):
print("person can walking")
def attack(self,dog):
dog.life_value -= self.aggressivity
##實體化程序
p1=Person('張三',10,1000) #類名()就相當于執行 Person.__init__()
#這里你可以理解為 p1={'name':'張三',’walk':'walk'}
print(p1.name) #查看屬性直接 物件名,屬性名
print(p1.walk()) # 呼叫方法, 物件名.方法名
print(p1.aggressivity)
print(p1.life_value)
c) 類屬性,類方法,靜態方法
- 類屬性: 類中方法外的變數稱為類屬性,該類被所有物件共享
- 類方法: 使用@classmethod修飾方法,使用類名直接訪問
- 靜態方法 使用@staticmethod修飾的方法,使用類名直接訪問的方法
Print(Student.native_place) 訪問類屬性
student.cm 呼叫類方法
student.sm 呼叫靜態方法
用Python實作植物大戰僵尸里的面向物件
class Flora:
role='flora' # 定義一個植物類,屬性是植物
def __init__(self,name,aggressivity,life_value,money):
self.name=name
self.aggressivity=aggressivity ## 每個角色都有自己的攻擊力
self.life_value=life_value #每個角色都有自己生命值
self.moeny=money
def attack(self,corpse):
# 植物都可以攻擊僵尸,僵尸的生命值會根據人的攻擊而下降
corpse.life_value -= self.aggressivity
class Corpse:
rols='corpse' #僵尸類,屬性都是僵尸
def __init__(self,name,aggressivity,life_value):
self.name = name
self.aggressivity = aggressivity ## 每個角色都有自己的攻擊力
self.life_value = life_value # 每個角色都有自己生命值
def eat(self,flora):
flora.life_value-=self.aggressivity
#僵尸可以吃植物,植物的生命力會下降
class Weapon: ## 武器庫
def __init__(self,name,price,aggrev,life_value):
self.name=name
self.price=price
self.aggrev=aggrev
self.life_value=life_value
def update(self,obj):
obj.money -= self.price # 購買武器的植物錢少錢少
obj.aggressivity += self.aggrev #攻擊力增加
obj.life_value += self.life_value #生命值增加
def prick(self,obj):
obj.life_value -= 500 # 武器的大招,一次掉血500
ps=Weapon('豌豆炮',200,6,100) ##有一個武器可供選擇,武器名字叫豌豆炮
cabbage=Flora('bigcabbage',10,1000,6000) #創建了大白菜植物
zombie=Corpse('z1','zob1',10) #創建了一個僵尸,普通僵尸
##植物感覺打不死僵尸,于是升級自己的武器為豌豆炮
print(cabbage.moeny,cabbage.life_value,cabbage.aggressivity)
print(zombie.life_value)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/272924.html
標籤:其他
下一篇:第一章 多級標題
