類
1.面向物件技術簡介- 類(Class): 用來描述具有相同的屬性和方法的物件的集合,它定義了該集合中每個物件所共有的屬性和方法,物件是類的實體,
- 方法:類中定義的函式,
- 類變數:類變數在整個實體化的物件中是公用的,類變數定義在類中且在函式體之外,類變數通常不作為實體變數使用,
- 資料成員:類變數或者實體變數用于處理類及其實體物件的相關的資料,
- 方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個程序叫方法的覆寫(override),也稱為方法的重寫,
- 區域變數:定義在方法中的變數,只作用于當前實體的類,
- 實體變數:在類的宣告中,屬性是用變數來表示的,這種變數就稱為實體變數,實體變數就是一個用 self 修飾的變數,
- 繼承:即一個派生類(derived class)繼承基類(base class)的欄位和方法,繼承也允許把一個派生類的物件作為一個基類物件對待,例如,有這樣一個設計:一個Dog型別的物件派生自Animal類
- 實體化:創建一個類的實體,類的具體物件,
- 物件:通過類定義的資料結構實體,物件包括兩個資料成員(類變數和實體變數)和方法,
1.1.Python類的語法
class 類名():#括號可有可無 類屬性 類函式/類方法
類名規范:數字/字幕/下劃線組成,不能以數字開頭,首字母大寫,駝峰命名
#類 class BoyFriend(): #類屬性 height=170 weight=105 money="1000W" #類函式 def cooking(self):#(self指實體本身)#會做飯 print("女朋友會做飯") def earn(self):#會賺錢 print("女朋友會賺錢") #實體化話物件 by = BoyFriend() #呼叫類函式 by.cooking()
#self
self代表類的實體,而非類
類的方法與普通的函式只有一個特別的區別——它們必須有一個額外的第一個引數名稱, 按照慣例它的名稱是 self,
class Test: def prt(self): print(self) print(self.__class__) t = Test()#隱士實體傳遞,最終傳遞self t.prt()
以上實體執行結果為:
<__main__.Test instance at 0x100771878> __main__.Test
1.2.實體方法
#類方法智能通過實體呼叫 t = Test()#實體 t.cooking()
1.3.類方法 @classmethod
#類 class BoyFriend(): #類函式 height=170 weight=105 money="1000W" #類函式 def cooking(self):#會做飯 print("女朋友會做飯") @classmethod#類方法不能呼叫類里面的屬性值 def earn(self): print("女朋友會賺錢") BoyFriend.earn()#呼叫成功 BoyFriend.cooking()#報錯:TypeError: cooking() missing 1 required positional argument: 'self'
1.4.靜態方法 @staticmethod
#類 class BoyFriend(): #類函式 height=170 weight=105 money="1000W" #類函式 def cooking(self):#會做飯 print("女朋友會做飯") #類方法 @classmethod def earn(self):#會賺錢 print("女朋友會賺錢") #靜態方法 @staticmethod#靜態方法不能呼叫類里面的屬性值 def music(): print("女朋友會唱歌") BoyFriend.music()#女朋友會唱歌
1.5.類的初始化函式
初始化函式再實體化物件的時候呼叫
class Teacher: def __init__(self):#這是初始化函式 print("這是初始化函式") def speak(self): print("這是類函式") t = Teacher() #列印結果:這是初始化函式
1.6.初始化函式傳參
class Teacher: def __init__(self,name,age):#初始化函式傳參 self.n = name#將初始化引數賦值給類屬性 self.a = age def speak(self): print("老師的名字是:{0},老師的年齡是:{1}".format(self.n,self.a)) t = Teacher("張三","18")#傳參必須與類初始化引數一致 t.speak() #列印結果:老師的名字是:張三,老師的年齡是:18
class Teacher: def __init__(self,name="張三",age="18"):#初始化函式傳參 self.n = name#將初始化引數賦值給類屬性 self.a = age def speak(self): print("老師的名字是:{0},老師的年齡是:{1}".format(self.n,self.a)) Teacher().speak()#老師的名字是:張三,老師的年齡是:18
2.1.繼承
#子類(派生類 DerivedClassName)會繼承父類(基類 BaseClassName)的屬性和方法,
#父類有的集成后,子類可以直接拿來用
#父類有,子類也有重名的函式,那么子類的實體優先呼叫子類的函式
#父類只能呼叫自己函式和屬性
#第一代機器人 class RoboOne(): def __init__(self,year,name): self.year=year#生產日期 self.name=name#名字 def xingzou(self): print("可以在平地上行走!") def biaoshi(self): print("{0}年生產的機器人{1},是中國研發的!".format(self.year,self.name)) #第二代機器人繼承第一代機器人的類 class RoboTwo(RoboOne):#集成父類
def xingzou(self):#子類里面的韓樹明與父類函式名重復的時候,就是重寫 print("可以在平地上平穩的行走!") def bizhang(self): print("可以避開障礙物!") r = RoboTwo("2022","哇卡哇卡") r.xingzou()#可以在平地上平穩的行走! r.bizhang()#可以避開障礙物! r.biaoshi()#2022年生產的機器人哇卡哇卡,是中國研發的!
2.2.子類中呼叫父類中的函式
#第一代機器人 class RoboOne(): def __init__(self,year,name): self.year=year#生產日期 self.name=name#名字 def xingzou(self): print("可以在平地上行走!") def biaoshi(self): print("{0}年生產的機器人{1},是中國研發的!".format(self.year,self.name)) #第二代機器人繼承第一代機器人的類 class RoboTwo(RoboOne): def xingzou(self):#子類里面的韓樹明與父類函式名重復的時候,就是重寫 print("可以在平地上平穩的行走!") def bizhang(self): #子類中呼叫父類的方法(呼叫子類未重寫的方法) self.biaoshi() print("可以避開障礙物!") r = RoboTwo("2022","盧卡盧卡") r.bizhang() # 列印結果:
2022年生產的機器人盧卡盧卡,是中國研發的!
可以避開障礙物!
2.3.多繼承
繼承多個父類
#繼承多個父類時父類中函式重名,根據排序先后進行呼叫(就近原則)
#初始化函式根據就近原則進行傳參
class Father():#父類 def __init__(self,name,car): self.name=name self.car=car def zuojia(self): print("{0}的座駕是{1}".format(self.name,self.car)) def computer(self): print("有一臺Mac!") class WangSir():#老王,為什么是老王,這是個迷!!!! def __init__(self,name,car): self.name=name self.car=car def zuojia(self): print("{0}的座駕是{1}".format(self.name,self.car)) def Money(self): print("有500W") class Son(WangSir,Father):#繼承兩個父類 def age(self): print("我滿18歲了!") s = Son("李剛","法拉利") s.zuojia()# s.age() s.computer() s.Money() 列印:
李剛的座駕是法拉利
我滿18歲了!
有一臺Mac!
有500W
2.4.練習一
# 1)創建一個類名為User的類 # 2)其中包含屬性first_name和last_name # 3)還有用戶簡介通常會存盤的其他幾個屬性,均是自定義,請放在初始化函式里面 # 4)在類User中定義一個名為describe_user()的方法,它列印用戶資訊摘要 # 5)再定義一個名為greet_user()的方法,它向用戶發出個性化的問候 # 6)創建多個表示不同用戶的實體,并將每個實體都呼叫上述兩個方法 class User(): def __init__(self,first_name,last_name,*args): self.first_name=first_name self.last_name=last_name self.args=args def describe_user(self): print("問候新冠肺炎!!!!") def greet_user(self): print("{0}{1}的簡介:{2}".format(self.first_name,self.last_name,self.args)) u = User("張","三","喜歡打雪仗","喜歡狗刨式","喜歡掉冰窟窿") u.describe_user() u.greet_user()
2.5.練習二
#人和機器人猜拳
#1)函式1:選擇角色1曹操,2張飛,3劉備
#2)函式2:角色猜拳1剪刀,2石頭,3布,玩家輸入一個1-3的數字
#3)函式3:電腦出拳,隨機產生1個1-3的數字,提示電腦出拳結果
#4)函式4:角色和機器出拳對戰,對戰結束后,最后出示本局對戰結果...贏...輸,然后提示用戶是否繼續?按y繼續,按n結束
#5)最后結束的時候輸出結果,角色贏幾局,電腦輸幾局,平局幾次,游戲結束
import random#亂數 # 猜拳 class Guess(): #選擇角色 def role(self): num = input("請選擇角色(1曹操,2張飛,3劉備)請輸入:") print("選擇角色:{0}".format(self.role_obtain(num))) print("************ 游戲開始 ************") print() self.DuelWar(self.role_obtain(num))#呼叫對戰 # print("角色:{0},猜拳游戲馬上開始!".format()) #角色出拳 def person_guess(self): guess = input("請出拳(1剪刀,2石頭,3布)請輸入:") return int(guess) #電腦出拳 def computer_guess(self): num = random.randint(1,3)#隨機1-3 return int(num) #角色轉換(數字轉角色) def role_obtain(self,num): try: dict = {"1":"曹操","2":"張飛","3":"劉備"} return dict[str(num)] except Exception as e: print("角色轉換(數字轉角色)例外:{0}".format(e)) #出拳轉換 def boxing_obtain(self,num): try: dicts = {"1":"剪刀", "2":"石頭", "3":"布"} return dicts[str(num)] except Exception as e: print("出拳轉換例外:{0}".format(e)) #對戰 def DuelWar(self,role_name): contin = "y" num=0#局數 person_num = 0#角色贏數 computer_num=0#電腦輸數 even = 0#平局數 while contin=="y": num+=1# print("************ 第 {0} 局 ************".format(num)) person_x = self.person_guess()#角色出拳 computer_x = self.computer_guess()#電腦出拳 #判斷角色贏 if (person_x==1 and computer_x==3) or (person_x==2 and computer_x==1) or (person_x==3 and computer_x==2): print("第{0}局 >>>>>>>>>>>>{1}>{2} :贏".format(num,self.boxing_obtain(person_x),self.boxing_obtain(computer_x))) print() person_num+=1 #判斷平局 elif person_x== computer_x: print("第{0}局 >>>>>>>>>>>>{1}>{2} :平局".format(num,self.boxing_obtain(person_x),self.boxing_obtain(computer_x))) print() even+=1 #判斷電腦輸 else: print("第{0}局 >>>>>>>>>>>>{1}>{2} :輸".format(num,self.boxing_obtain(person_x),self.boxing_obtain(computer_x))) print() computer_num += 1 yn = input("游戲是否繼續:(y繼續,n結束)") print() if yn=="y": continue else: print("*"*30) print("猜拳結束:\n{0}贏{1}局\n電腦輸{2}局\n平局{3}次".format(role_name,person_num,computer_num,even)) print("*" * 30) break if __name__ == '__main__': g = Guess() g.role()
執行結果:
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/540226.html
標籤:Python
下一篇:初試高云FPGA

