find /etc -name "*.conf" -> 在etc目錄下面查找conf文件
grep -> 查找字符串
面向?qū)ο笏拇笾е撼橄蟆⒎庋b、繼承、多態(tài)
抽象 - 定義類(lèi)的過(guò)程就是提取共性的抽象過(guò)程
數(shù)據(jù)抽象 - 找到對(duì)象的靜態(tài)特征 - 屬性 - 找名詞
行為抽象 - 找到對(duì)象的動(dòng)態(tài)特征 - 方法 - 找動(dòng)詞
封裝 - 將數(shù)據(jù)和操作數(shù)據(jù)的方法從邏輯上組成一個(gè)整體 - 對(duì)象
隱藏實(shí)現(xiàn)細(xì)節(jié) 暴露簡(jiǎn)單的調(diào)用接口
繼承 - 從已有的類(lèi)創(chuàng)建新類(lèi)的過(guò)程
提供繼承信息的稱(chēng)之為父類(lèi),得到繼承信息的稱(chēng)之為子類(lèi)
多態(tài) - 調(diào)用相同的方法,做了不同的事情
同樣的方法在運(yùn)行時(shí)表現(xiàn)出不同的行為
子類(lèi)重寫(xiě)父類(lèi)方法,不同的子類(lèi)給出不同的實(shí)現(xiàn)版本
抽象類(lèi):在抽象類(lèi)中聲明的抽象方法必須要在子類(lèi)中實(shí)現(xiàn),抽象方法不能被繼承
class Employee(object, metaclass=ABCMeta):
@abstractmethod
def ……
查找替換:
/ 進(jìn)入末行模式,輸入查找內(nèi)容 小寫(xiě)n往下搜索,大寫(xiě)N往上搜索
:1,$
從第一行到最后一行
:1,$s/self/shit
從第一行到最后一行,找到self替換成shit (s:substitute)
:1,$s/self/shit/c
從第一行到最后一行,找到self替換成shit,并需要進(jìn)行確認(rèn)
:1,$s/self/shit/ci
從第一行到最后一行,找到self替換成shit,并需要進(jìn)行確認(rèn),同時(shí)忽略大小寫(xiě)(i:ignore case)
名詞:撲克 玩家 牌
動(dòng)詞:洗牌 發(fā)牌 摸牌
類(lèi)和類(lèi)之間(對(duì)象之間)的關(guān)系:
- is-a關(guān)系 - 繼承
- has-a關(guān)系 - 關(guān)聯(lián)(學(xué)生有筆記本電腦)/聚合/合成 ((強(qiáng)關(guān)聯(lián))小汽車(chē)有引擎:聚合或者合成)
- use-a關(guān)系 - 依賴(lài)
面向?qū)ο笃邆€(gè)設(shè)計(jì)原則:
1.單一職責(zé)原則 - 一個(gè)類(lèi)只做該做的事情,不做不該做的事情
2.開(kāi)閉原則
3.依賴(lài)倒轉(zhuǎn)原則
4.里氏替換原則
5.接口隔離原則
6.合成聚合復(fù)用原則 - 優(yōu)先考慮強(qiáng)關(guān)聯(lián)關(guān)系而不是繼承關(guān)系來(lái)復(fù)用代碼
7.最少知識(shí)原則(迪米特法則)
設(shè)計(jì)模式:
GoF設(shè)計(jì)模式(23種經(jīng)典場(chǎng)景,有17種在python中被弱化了(因?yàn)槭莿?dòng)態(tài)弱類(lèi)型語(yǔ)言))
!經(jīng)驗(yàn): 符號(hào)常量?jī)?yōu)于字面常量,枚舉類(lèi)型是定義符號(hào)常量的最佳選擇
SPADE.value可以取到常量的值,Suite是可以迭代的類(lèi)型
class Suite(Enum):
SPADE = 0
HEART = 1
CLUB = 2
DIAMOND = 3
__repr__
:
對(duì)象作為列表的元素時(shí),打印自動(dòng)調(diào)用__repr__
def func1(a, *, key='')
*前面的參數(shù)稱(chēng)為位置參數(shù)(傳參時(shí)不用指定參數(shù)名,按位置對(duì)號(hào)入座即可)
*后面的參數(shù)稱(chēng)為命名關(guān)鍵字參數(shù)(傳參時(shí)必須給出參數(shù)名和參數(shù)值)
工資結(jié)算系統(tǒng):
#!/usr/bin/python3
from abc import ABCMeta, abstractmethod
class Employee(object, metaclass=ABCMeta):
def __init__(self, name):
self.name = name
@abstractmethod
def get_salary(self):
pass
class Manager(Employee):
def get_salary(self):
return 15000
class Programmer(Employee):
def __init__(self, name):
self.working_hour = 0
super().__init__(name)
def get_salary(self):
return 200 * self.working_hour
class Salesman(Employee):
"""銷(xiāo)售員"""
def __init__(self, name):
self.sales = 0
super().__init__(name)
def get_salary(self):
return 1800 + self.sales * 0.05
def main():
emps = [
Manager('曹操'), Programmer('荀彧'),
Programmer('郭嘉'), Salesman('張遼')
]
for emp in emps:
if isinstance(emp, Programmer):
hour = int(input(f'請(qǐng)輸入{emp.name}本月工時(shí):'))
emp.working_hour = hour
elif isinstance(emp, Salesman):
sales = float(input(f'請(qǐng)輸入{emp.name}本月銷(xiāo)售額:'))
emp.sales = sales
print(f'{emp.name}本月工資為:{emp.get_salary()}元')
if __name__ == '__main__':
main()
撲克游戲:
#!/usr/bin/python3
from enum import Enum, unique
import random
# 經(jīng)驗(yàn): 符號(hào)常量?jī)?yōu)于字面常量,枚舉類(lèi)型是定義符號(hào)常量的最佳選擇
# SPADE.value可以取到常量的值,Suite是可以迭代的類(lèi)型
@unique
class Suite(Enum):
"""花色的枚舉"""
SPADE = 0
HEART = 1
CLUB = 2
DIAMOND = 3
class Card(object):
def __init__(self, suite, face):
self.suite = suite
self.face = face
def show(self):
suites = ['黑', '紅', '梅', '方']
faces = [
'', 'A', '2', '3', '4', '5', '6',
'7', '8', '9', '10', 'J', 'Q', 'K'
]
return f'{suites[self.suite.value]}{faces[self.face]}'
def __str__(self):
return self.show()
def __repr__(self):
return self.show()
"""
def __gt__(self, other):
if self.suite == other.suite:
return self.face > other.face
return self.suite.value > other.suite.value
"""
class Poker:
def __init__(self):
self.index = 0
# 生成式/推導(dǎo)式
self.cards = [Card(suite, face)
for suite in Suite
for face in range(1, 14)]
def shuffle(self):
"""洗牌"""
random.shuffle(self.cards)
def deal(self):
"""發(fā)牌"""
card = self.cards[self.index]
self.index += 1
return card
@property
def has_more(self):
"""是否還有更多的牌"""
return self.index < len(self.cards)
class Player(object):
"""玩家(與牌既有關(guān)聯(lián)關(guān)系,又有依賴(lài)關(guān)系)"""
def __init__(self, name):
self.name = name
self.cards = []
def get_one(self, card):
"""摸一張牌"""
self.cards.append(card)
def sort_cards(self, key=lambda card: (card.suite.value, card.face)):
"""玩家整理手上的牌"""
self.cards.sort(key=key)
def main():
poker = Poker()
poker.shuffle()
print(poker.cards)
players = [Player('東邪'), Player('西毒'), Player('南帝'), Player('北丐')]
for _ in range(13):
for player in players:
player.get_one(poker.deal())
for player in players:
player.sort_cards(key=lambda card: (card.face, card.suite.value))
print(player.name, end=': ')
print(player.cards)
if __name__ == '__main__':
main()