面向对象的四大支柱:抽象、封装、继承、多态
抽象:定义类的过程就是提取共性的抽象过程
数据抽象:找到对象的静态特征 - 属性 - 找名词
行为抽象:找到对象的动态特征 - 方法 - 找动词
封装:将数据和操作数据的方法从逻辑上组成一个整体 - 对象
隐藏实现细节,暴露简单的调用接口
继承:从已有的类创建新类的过程
提供继承信息的称之为父类,得到继承信息的称之为子类
多态:调用相同的方法,做了不同的事情 - 同样的方法在运行时表现出不同的行为
子类重写父类方法,不同子类给出不同的实现版本
类和类之间(对象之间)的关系:
1.is-a关系 - 继承
2.has-a关系 - 关联 / 聚合 / 合成
3.use-a关系 - 依赖
面向对象七个设计原则:
1.单一职责原则 - 一个类只做该做的事情不做不该做的事情
2.开闭原则
3.依赖倒转原则
4.里式替换原则
5.接口隔离原则
6.合成聚合复用原则 - 优先考虑强关联而不是继承关系来复用代码
7.最少知识原则(迪米特法则)
GoF设计模式: 23种经典场景 - python中弱化了很大一部分
符号常量优于字面常量, 枚举类型是定义符号常量的最佳选择
@unique : 值不能重复
from enum import Enum
class Suite(Enum):
SPADE = 0
HEART = 1
CLUB = 2
DIAMOND = 3
* 前面的参数称为位置参数(传参是不用指定参数名按位置对号入座即可)
* 后面的参数称为关键字参数(传参时必须指定参数名和参数值)
vim编辑器录制宏
1.在命令模式下按q,再加字母a-z或者数字0-9为宏的名字
2.recording指示开始录制,开始录制操作
3.返回命令模式按q结束宏录制
4.@+宏名字播放宏
5.次数 + @ + 宏名字 :播放指定次数的宏
扑克游戏
1 #!/usr/bin/python3
2 """扑克游戏"""
3 from enum import Enum, unique
4 import random
5
6
7 @unique
8 class Suite(Enum):
9 SPADE = 0
10 HEART = 1
11 CLUB = 2
12 DIAMOND = 3
13
14
15 class Card(object):
16 def __init__(self, suite, face):
17 self.suite = suite
18 self.face = face
19
20 def show(self):
21 suites = ['黑', '红', '梅', '方']
22 faces = ['', 'A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
23 return f'{suites[self.suite.value]}{faces[self.face]}'
24
25 """
26 def __lt__(self, other):
27 if self.suite == other.suite:
28 return self.face < other.face
29 return self.suite.value < other.suite.value
30 """
31
32 def __str__(self):
33 return self.show()
34
35 def __repr__(self):
36 return self.show()
37
38
39 class Poker(object):
40 """扑克"""
41
42 def __init__(self):
43 self.index = 0
44 self.cards = [Card(suite, face) for suite in Suite for face in range(1, 14)]
45
46 def shuffle(self):
47 """洗牌"""
48 random.shuffle(self.cards)
49
50 def deal(self):
51 """发牌"""
52 card = self.cards[self.index]
53 self.index += 1
54 return card
55
56 @property
57 def has_more(self):
58 """是否有更多的牌"""
59 return self.index < len(self.cards)
60
61
62 class Player(object):
63 """玩家"""
64
65 def __init__(self, name):
66 self.name = name
67 self.cards = []
68
69 def get_one(self, card):
70 """摸一张牌"""
71 self.cards.append(card)
72
73 def sort_cards(self, key=lambda card: (card.suite.value, card.face)):
74 """玩家整理手上的牌"""
75 self.cards.sort(key=key)
76
77
78 def main():
79 poker = Poker()
80 poker.shuffle()
81 players = [Player('东邪'), Player('西毒'), Player('南帝'), Player('北丐')]
82 for _ in range(13):
83 for player in players:
84 player.get_one(poker.deal())
85 for player in players:
86 player.sort_cards(key = lambda card: card.face)
87 print(player.name, end=':')
88 print(player.cards)
89
90
91 if __name__ == '__main__':
92 main()
输出指定年月的日历:
import calendar
import time
def main():
word = input('1.查看本月\n2.查看其它时间\n请选择:')
if word == '1':
now_month()
else:
print('输入要查询的日历,年份或者月份为空则显示当前时间的日历:')
year = int(input('请输入年:'))
month = int(input('请输入月:'))
month_calendar(year, month)
def month_calendar(year, month):
month_words = ['March', 'April', 'May', 'June', 'July',
'August', 'September', 'October', 'November', 'December', 'January', 'February']
day_month = calendar.monthrange(year, month)[1]
# print(day_month)
if month == 1:
century = int(str(year - 1)[0: 2]) + 1
year = int(str(year - 1)[2:])
month = 13
elif month == 2:
century = int(str(year - 1)[0: 2]) + 1
year = int(str(year - 1)[2:])
month = 14
else:
century = int(str(year)[0: 2]) + 1
year = int(str(year)[2:])
day = 1
# print(century, year, month)
c = century - 1
week = year + int(year / 4) + int(c / 4) - 2 * c + int(26 * (month + 1) / 10) + day - 1
week %= 7
# print(week)
print(f' {month_words[month - 3]} {c}{year + 1 if month == 13 or month == 14 else year}')
print(' Su Mo Tu We Th Fr Sa')
count = week + 1
print(week * ' ', end='')
for day in range(1, day_month + 1):
print(str(day).center(4, ' '), end='')
if count % 7 == 0:
print('\n')
count += 1
def now_month():
now = time.localtime()
year = now.tm_year
month = now.tm_mon
month_calendar(year, month)
if __name__ == '__main__':
main()
1.JPG
网友评论