學習python第十五天,面對物件
面對物件又叫勸退物件,要么勸退你的物件,要么python勸退你,hhhh
開玩笑,但是這塊知識點確實比較難
面向物件編
面向物件編程
指令式編程---->面向程序(函式)編程----->程式比較簡單的時候沒有任何毛病
編程范式(程式設計的方法論):面向物件編程/函式式編程
物件: 物件是可以接收訊息的物體,面向物件編程就是通過給物件發訊息達到解決問題的目標
物件 = 資料 + 函式(方法)----->物件將資料和操作資料的函式從邏輯上變成一個整體,
類(型別): 將一大類物件共同的特正抽取出來之后得到的一個抽象概念
簡單地說,類是物件的藍圖(模板),有了類才能創建出這種類的物件
面向物件編程:
1、定義類---->使用駝峰命名法,每個單詞首字母大寫
~資料抽象: 找到物件相關的靜態特征(屬性)---->找名詞
~行為抽象: 找到和物件相關的動態特征(方法)----->找動詞
2、造物件
3、發訊息
一切皆為物件
物件都有屬性和行為
每個物件都是獨一無二的
物件一定屬于某個類
面對物件編程一般分為三個步驟
# 第一步,定義類
class Student:
# 資料抽象
"""
學生
"""
def __init__(self, name, age):
self.name = name
self.age = age
pass
# 行為抽象
def eat(self):
"""
吃飯
:return:
"""
print(f'{self.name}正在吃飯')
pass
def study(self, course_name):
"""
學習
:param course_name:
:return:
"""
print(f'{self.name}正在學習{course_name}')
def play(self, game_name):
"""
玩耍
:param game_name:
:return:
"""
print(f'{self.name}正在玩{game_name}')
pass
def watch_av(self):
"""
看片
:return:
"""
if self.age < 18:
print(f'{self.name}小于18歲,只能看熊出沒')
else:
print(f'{self.name}正在看島國片')
# 第二步: 創建物件 ---->構造器語法--->類名(...., .....)
stu1 = Student(name='龔凡', age=17)
stu2 = Student('愛因斯坦', 67)
if __name__ == '__main__':
# 第二步: 創建物件 ---->構造器語法--->類名(...., .....)
stu1 = Student(name='龔凡', age=17)
stu2 = Student('愛因斯坦', 67)
# 第三步,給物件發送訊息(呼叫物件的方法)
stu1.study('python程式設計的方法論')
# Student.study(stu1, 'python程式設計的方法論')
stu2.study('光子原理')
stu1.eat()
stu1.play('王者榮耀')
stu2.play('斗地主')
stu1.watch_av()
stu2.watch_av()
簡單來說,
1、就是創建類,物件,然后闡述物件屬性、 行為,
2、找到這個類里面一個確切的物件,比如愛因斯坦,龔凡
3,給這兩個確切的物件發送訊息、指令,然他們執行他們的行為
練習
有一個圓形游泳池,泳池外圍有一條三米寬的石板路將泳池圍起,小路外圍又是一道圍墻將小路圍起來
石板路的造價為58.5一平米,然后圍墻造價為38.5一米
現在要求用面向物件的方法求石板路和圍墻的造價
class Circle:
def __init__(self, radius):
self.radius = radius
def perimeter(self):
return 2 * math.pi * self.radius
# 圓的周長公式
def area(self):
return math.pi * self.radius ** 2
# 圓的面積公式
if __name__ == '__main__':
r = float(input('請輸入游泳池的半徑: '))
c1, c2 = Circle(r), Circle(r + 3)
# 求出大圓、小圓點面積
fence_price = c2.perimeter() * 38.5
aisle_price = (c2.area() - c1.area()) * 58.5
print(fence_price + aisle_price)
練習
顯示出一個時鐘
首先要顯示時鐘的字樣,其次我們要控制它的走字問題
import time
import os
class Clock:
"""時鐘"""
def __init__(self, hour, minute, second):
self.hour = hour
self.minute = minute
self.second = second
def show(self):
"""
顯示時間
輸入起始時間
:return:
"""
return f'{self.hour:>2d}:{self.minute:>2d}:{self.second:>2d}'
def run(self):
"""
走字
根據時鐘走字規則加減時、 分、 秒
:return:
"""
self.second += 1
if self.second == 60:
self.second = 0
self.minute += 1
if self.minute == 60:
self.minute = 0
self.hour += 1
if self.hour == 24:
self.hour = 0
if __name__ == '__main__':
clock = Clock(23, 59, 58)
while True:
clock.run()
print(clock.show())
time.sleep(1)
# 回圈一次休眠一秒
os.system('cls')
# 清屏函式
靜態方法、類方法
只知道三條邊,用面向物件計算三角形面積
定義描述三角形的類,提供計算周長和面積的方法
我們在類里面寫的函式,通常稱之為方法,它們基本上都是發給物件的訊息,
但是有的時候,我們的訊息并不想發給物件,而是希望發給這個類(類本身也是一個物件),
這個時候,我們可以使用靜態方法或類方法,
class Triangle:
"""三角形"""
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
# @classmethod
# 使用類方法判斷,這三條邊是否能夠構成三角形,這兩個@單詞是使用這兩個方法的鑰匙,有鑰匙才能使用
# def is_valid(cls, a, b, c):
# return a + b > c and b + c > a and a + c > b
@staticmethod
# 使用靜態方法判斷,這三條邊是否能夠構成三角形
def is_valid(a, b, c):
return a + b > c and b + c > a and a + c > b
def perimeter(self):
return self.a + self.b + self.c
def area(self):
half = self.perimeter() / 2
return (half * (half - self.a) * (half - self.b) * (half - self.c)) ** 0.5
if __name__ == '__main__':
# 呼叫靜態方法,判斷三條邊能否構成三角形
if Triangle.is_valid(3, 4, 5):
t = Triangle(3, 4, 5)
print(t.perimeter())
print(t.area())
else:
print('無效的邊長,無法構造三角形物件')
靜態方法 - 發給類的訊息 ---> @staticmethod ---> 裝飾器
類方法 - 發給類的訊息 ---> @classmethod ---> 裝飾器 ---> 第一個引數(cls)是接收訊息的類
作業
使用面對物件制作倒計時器
import time
import os
class Clock:
"""時鐘"""
def __init__(self, hour, minute, second):
self.hour = hour
self.minute = minute
self.second = second
def show(self):
"""
顯示時間
:return:
"""
return f'{self.hour:>2d}:{self.minute:>2d}:{self.second:>2d}'
def run(self):
"""
走字
:return:
"""
if self.second > 0:
self.second -= 1
if self.second == 0:
if self.minute > 0:
self.second = 60
self.minute -= 1
self.second -= 1
if self.minute == 0 and self.second == 0:
if self.hour > 0:
self.hour -= 1
self.minute = 60
self.minute -= 1
if self.hour == 0 and self.minute == 0 and self.second == 0:
return '時間到'
if __name__ == '__main__':
clock = Clock(1, 1, 0)
while True:
if clock.run() == '時間到':
print(clock.run())
break
else:
print(clock.show())
time.sleep(1)
os.system('cls')
王者榮耀,小兵和鎧爹的戰爭
import random
class Hero:
def __init__(self, name, blood,):
"""
:param name: 人物名字
:param blood: 人物血量
"""
self.name = name
self.blood = blood
def kill_one(self, enemy):
enemy.blood -= 5
return f'{self.name}一技能命中對方,{enemy.name}減少5滴血'
def kill_two(self, enemy):
enemy.blood -= 10
return f'{self.name}二技能命中對方,{enemy.name}減少10滴血'
def kill_big(self, enemy):
enemy.blood -= 20
return f'{self.name}大招命中對方,{enemy.name}減少20滴血'
def kill_A(self, enemy):
enemy.blood -= 5
return f'{self.name}A了一下對方,{enemy.name}減少2滴血'
pass
fatherK = Hero('鎧爹', 50)
batman = Hero('小兵', 30)
print('######開始游戲######')
while True:
if fatherK.blood <= 0 or batman.blood <= 0:
break
h = random.randrange(1, 10)
print(h)
if h == 1:
print(fatherK.kill_one(batman))
elif h == 2:
print(fatherK.kill_two(batman))
elif h == 3:
print(fatherK.kill_big(batman))
elif h == 10:
print(fatherK.kill_A(batman))
else:
print(batman.kill_A(fatherK))
print(f'{fatherK.name}還剩{fatherK.blood}')
print(f'{batman.name}還剩{batman.blood}')
if fatherK.blood <= 0:
print(f'{batman.name}獲勝')
else:
print(f'{fatherK.name}獲勝')
我盡力了
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/292350.html
標籤:python
