day18- 面向對象程序進階和繼承(10.13)
1、作業講評-倒計時計時器
import time
class CountdownClock : """倒計時計時器""" def __init__ ( self
, hour
, minute
, second
) : """初始化方法:param hour:時:param minute:分:param second: 秒""" self
. hour
= hourself
. minute
= minuteself
. second
= second
def show ( self
) : """顯示時間""" return f' { self. hour: 0>2d } : { self. minute: 0>2d } : { self. second: 0>2d } ' def is_running ( self
) : """判斷倒計時是否還在運行""" return self
. hour
!= 0 or self
. minute
!= 0 or self
. second
!= 0 def run ( self
) :
if self
. is_running
( ) : self
. second
-= 1 if self
. second
< 0 : self
. second
= 59 self
. minute
-= 1 if self
. minute
< 0 : self
. minute
= 59 self
. hour
-= 1
clock
= CountdownClock
( 0 , 1 , 5 )
print ( clock
. show
( ) )
while clock
. is_running
( ) : time
. sleep
( 1 ) clock
. run
( ) print ( clock
. show
( ) ) print ( '倒計時結束,時間到了' )
2、練習
練習1:定義類描述平面上的點,提供移動點,計算一個點到另一個點距離的方法 練習2:定義類描述平面上的線段,提供計算線段長度,判斷一個線段與另一個線段是否相交的方法 練習3:三角形,周長,面積 bi / do / du 二–> double tri --> 三 quarter penta
import math
class Point : def __init__ ( self
, x1
, y1
, x2
, y2
) : self
. x1
= x1self
. x2
= x2self
. y1
= y1self
. y2
= y2
def distance ( self
) : return ( ( self
. x1
- self
. x2
) ** 2 + ( self
. y1
- self
. y2
) ** 2 ) ** 0.5 point
= Point
( 1 , 2 , 3 , 4 )
print ( point
. distance
( ) )
class Point : def __init__ ( self
, x
, y
) : self
. x
= xself
. y
= y
def move_to ( self
, x
, y
) : self
. x
= xself
. y
= y
def move_by ( self
, dx
, dy
) : self
. x
+= dxself
. y
+= dy
def distance ( self
, other
) : return math
. sqrt
( ( self
. x
- other
. x
) ** 2 + ( self
. y
- other
. y
) ** 2 ) def __repr__ ( self
) : return f'< { self. x} , { self. y} >' p1
= Point
( 3 , 5 )
p2
= Point
( 6 , 1 )
p1
. move_to
( 1 , - 1 )
p2
. move_by
( 1 , - 1 )
print ( p1
, p2
)
print ( p1
. distance
( p2
) )
p2
. move_by
( 1 , - 1 )
print ( p1
. distance
( p2
) )
練習2:定義類描述平面上的線段,提供計算線段長度,判斷一個線段與另一個線段是否相交的方法 **答案
class Line : def __init__ ( self
, start
: Point
, end
: Point
) : self
. start
= startself
. end
= end
def length ( self
) : return self
. start
. distance
( self
. end
) def intersected ( self
, other
) : sx1
, sy1
, ex1
, ey1
= self
. start
. x
, self
. start
. y
, self
. end
. x
, self
. end
. ysx2
, sy2
, ex2
, ey2
= other
. start
. x
, other
. start
. y
, self
. end
. x
, self
. end
. y
return not ( max ( sx1
, ex1
) < min ( sx2
, ex2
) or max ( sx2
, ex2
) < min ( sx1
, ex1
) or max ( sy1
, ey1
) < min ( sy2
, ey2
) or max ( sy2
, ey2
) < min ( sy1
, ey1
) ) p1
= Point
( 3 , 5 )
p2
= Point
( 6 , 1 )
p1
. move_to
( 1 , - 1 )
p2
. move_by
( 1 , - 1 )
print ( p1
, p2
)
print ( p1
. distance
( p2
) )
p2
. move_by
( 1 , - 1 )
print ( p1
. distance
( p2
) ) line1
= Line
( p1
, p2
)
print ( line1
. length
( ) )
p3
= Point
( - 1 , - 2 )
p4
= Point
( 6 , 2 )
line2
= Line
( p3
, p4
)
print ( line2
. length
( ) )
print ( line2
. intersected
( line1
) )
p3
. move_to
( 4 , 5 )
line3
= Line
( p3
, p4
)
print ( line1
. intersected
( line3
) )
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FyIE2IWl-1634122631640)(C:\Users\z\Desktop\tupian\10.13\5.jpg)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-89LKa4bW-1634122631644)(C:\Users\z\Desktop\tupian\10.13\4.jpg)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-HC3peiKP-1634122631646)(C:\Users\z\Desktop\tupian\10.13\3.jpg)]
練習3:三角形,周長,面積
“”" 靜態方法 - 不是三角形對象的消息,而是發給三角形類的消息 類方法 - 發給類的消息(比靜態方法多一個參數,代表接受消息的類) 靜態方法,類方法是一樣的,類方法多一個參數,類參數可以得到和三角形相關的信息 Triangle.check_sides(a, b, c) “”"
# 自己練習3:
class Triangle: # 三角形def __init__(self, a, b, c):self.a = aself.b = bself.c = cdef is_triangle(self):return ((self.a + self.b) > self.c) and ((self.a + self.c) > self.b) and ((self.c + self.b) > self.a)def perimeter(self):return self.a + self.b + self.cdef area(self):p = self.a + self.b + self.creturn (p/2*(p-self.a)(p-self.b)(p-self.c))**0.5triangle = Triangle(1, 2, 3)
if triangle.is_triangle():triangle.perimeter()triangle.area()
else:print('不符合三角形構成的條件')
class Triangle : def __init__ ( self
, a
, b
, c
) : self
. a
= aself
. b
= bself
. c
= c
@staticmethod def check_sides ( 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
) : p
= self
. perimeter
( ) / 2 a
, b
, c
= self
. a
, self
. b
, self
. c
return math
. sqrt
( p
* ( p
- a
) * ( p
- b
) * ( p
- c
) )
def main ( ) : a
, b
, c
= map ( float , input ( '請輸入三條邊的長度:' ) . split
( ) ) if Triangle
. check_sides
( a
, b
, c
) : tri
= Triangle
( a
, b
, c
) print ( f'三角形周長: { tri. perimeter( ) } ' ) print ( f'三角形面積: { tri. area( ) } ' ) print ( '無法構成三角形' ) if __name__
== '__main__' : main
( )
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-TNk9Ebob-1634122631649)(C:\Users\z\Desktop\tupian\10.13\7.jpg)]
3、撲克牌游戲案例***
*****撲克游戲案例(反復推敲),有哪些類?對應的對象有哪些屬性和方法?(名詞-類/屬性,動詞-行為) 牌 - 一張 - 屬性:花色/點數 - 行為:顯示牌面,比大小 撲克 - 54張 - 屬性:裝54張牌的列表;- 行為:洗牌/發牌 玩家 - ID/昵稱/手牌(列表);-行為:摸牌/打牌/整理手牌 less than – > lt --> < great than --> gt --> > equal to --> eq --> == 黑杰克的游戲 后面還有哪些階段?具體老師。 “”" 經驗:符號常量總是優于字面常量!!!常量不易改
import randomSPADE
, HEART
, CLUB
, DIAMOND
= range ( 4 ) class Card : """牌""" def __init__ ( self
, suite
, face
) : """初始化方法:param suite:花色:param face: 牌面""" self
. suite
= suiteself
. face
= face
def __repr__ ( self
) : return self
. show
( ) def __lt__ ( self
, other
) : if self
. suite
!= other
. suite
: return self
. suite
< other
. suiteface1
= 14 if self
. face
== 1 else self
. faceface2
= 14 if other
. face
== 1 else other
. face
return face1
< face2
def show ( self
) : """顯示牌面""" suite
= ( '?' , '?' , '?' , '?' ) faces
= ( '' , 'A' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , '10' , 'J' , 'Q' , 'K' ) return f' { suite[ self. suite] } { faces[ self. face] } ' class Poker : """撲克""" def __init__ ( self
) : self
. cards
= [ Card
( suite
, face
) for suite
in range ( 4 ) for face
in range ( 1 , 14 ) ] self
. index
= 0 def shuffle ( self
) : """洗牌""" self
. index
= 0 random
. shuffle
( self
. cards
) def has_more ( self
) : """有沒有牌可以發出""" return self
. index
< len ( self
. cards
) def deal ( self
) : """發牌"""
card
= self
. cards
[ self
. index
] self
. index
+= 1 return card
class Player : """玩家""" def __init__ ( self
, nickname
) : """初始化方法:param nickname: 昵稱""" self
. nickname
= nicknameself
. cards
= [ ] def get_card ( self
, card
) : """摸牌""" self
. cards
. append
( card
) def arrange ( self
) : """整理手牌??""" poker
= Poker
( )
poker
. shuffle
( )
names
= ( '妲己' , '狄仁杰' , '趙云' , '孫悟空' )
players
= [ Player
( name
) for name
in names
]
for _
in range ( 13 ) : for player
in players
: card
= poker
. deal
( ) player
. get_card
( card
) for player
in players
: player
. arrange
( ) print ( player
. nickname
, end
= '' ) print ( player
. cards
)
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-j943ucue-1634122631651)(C:\Users\z\Desktop\tupian\10.13\8.jpg)]
4、繼承
“”" 繼承:通過已有的類創建新的類,子類會得到父類的繼承信息 python語言運行多重繼承,一個類可以有多個父類 父類:提供繼承信息的(基類,超類) 子類: 得到繼承信息的(派生類) 公共的部分放在父類中,特有的部分寫在子類中,子類通過繼承父類,得到那些公共的部分 繼承也是一種復用代碼的方式 單一繼承:一個類只能有唯一的父類,建議大家使用繼承的時候使用單一繼承 “”"
學生:姓名
/ 年齡
/ 年級;吃飯
/ 玩耍
/ 學習
老師:姓名
/ 年齡
/ 職稱;吃飯
/ 玩耍
/ 授課代碼有很多種很壞的味道,但重復是最壞的一種
"""class Person:def __init__(self, name, age):""" 初始化方法
: param name
: 姓名
: param age
: 年齡
: param grade
: 年級
"""self.name = nameself.age = agedef eat(self):""" 吃飯
"""print(f'{self.name}正在吃飯.')def play(self):""" 玩耍
"""print(f'{self.name}正在玩耍.')"""
繼承:通過已有的類創建新的類,子類會得到父類的繼承信息
python語言運行多重繼承,一個類可以有多個父類
父類:提供繼承信息的(基類,超類)
子類: 得到繼承信息的(派生類)
公共的部分放在父類中,特有的部分寫在子類中,子類通過繼承父類,得到那些公共的部分
繼承也是一種復用代碼的方式
單一繼承:一個類只能有唯一的父類,建議大家使用繼承的時候使用單一繼承
"""class Student(Person):""" 學生
"""def __init__(self, name, age, grade):""" 初始化方法
: param name
: 姓名
: param age
: 年齡
: param grade
: 年級
"""super().__init__(name, age) # 得到父類self.grade = gradedef study(self, course_name):""" 學習
: param course_name
: 課程名稱
"""print(f'{self.name}正在學習{course_name}.')class Teacher(Person):""" 學生
"""def __init__(self, name, age, title):""" 初始化方法
: param name
: 姓名
: param age
: 年齡
: param title
: 年級
"""super().__init__(name, age)self.title = titledef teach(self, course_name):""" 學習
: param course_name
: 課程名稱
"" "
print ( f' { self. name} 正在講授 { course_name} .' ) student
= Student
( '王大錘' , 18 , '大一' )
teacher
= Teacher
( '陳來' , 13 , '教授' )
student
. play
( )
student
. study
( '數學' )
teacher
. play
( )
teacher
. teach
( 'python數據' )
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-pHrGoTVM-1634122631652)(C:\Users\z\Desktop\tupian\10.13\9.jpg)]
day18作業-工資(月薪)結算系統
公司有三類員工,結算工資的方式是不一樣的:
1.部門經理:15000元 / 月
2.程序員->計算工時-->200元/小時 * 本月工時
3.銷售員 -> 底薪+提成 - > 1800元 + 本月銷售額5%提出
給出員工信息列表,自動結算月薪
員工類
employee(員工),employer(雇主)
salary
manager
programmer
salesman
5、其他附錄
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-uE6cztFw-1634122631653)(C:\Users\z\Desktop\tupian\10.13\2.jpg)]
student = Student(‘王大錘’, 18, ‘大一’) teacher = Teacher(‘陳來’, 13, ‘教授’) student.play() student.study(‘數學’) teacher.play() teacher.teach(‘python數據’)
[外鏈圖片轉存中...(img-pHrGoTVM-1634122631652)]
day18作業-工資(月薪)結算系統 公司有三類員工,結算工資的方式是不一樣的: 1.部門經理:15000元 / 月 2.程序員->計算工時–>200元/小時 * 本月工時 3.銷售員 -> 底薪+提成 - > 1800元 + 本月銷售額5%提出 給出員工信息列表,自動結算月薪 員工類 employee(員工),employer(雇主) salary manager programmer salesman
### 5、其他附錄[外鏈圖片轉存中...(img-uE6cztFw-1634122631653)][外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-zIQDksJP-1634122631654)(C:\Users\z\Desktop\tupian\10.13\6.jpg)]
總結
以上是生活随笔 為你收集整理的day18-面向对象程序进阶和继承(10.13) 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。