Day014 - Linux-Vim(2)(2018-11-17)

find /etc -name "*.conf" -> 在etc目錄下面查找conf文件
grep -> 查找字符串

面向?qū)ο笏拇笾е撼橄?、封裝、繼承、多態(tài)

抽象 - 定義類的過程就是提取共性的抽象過程
數(shù)據(jù)抽象 - 找到對象的靜態(tài)特征 - 屬性 - 找名詞
行為抽象 - 找到對象的動態(tài)特征 - 方法 - 找動詞

封裝 - 將數(shù)據(jù)和操作數(shù)據(jù)的方法從邏輯上組成一個整體 - 對象
隱藏實現(xiàn)細(xì)節(jié) 暴露簡單的調(diào)用接口

繼承 - 從已有的類創(chuàng)建新類的過程
提供繼承信息的稱之為父類,得到繼承信息的稱之為子類

多態(tài) - 調(diào)用相同的方法,做了不同的事情
同樣的方法在運(yùn)行時表現(xiàn)出不同的行為
子類重寫父類方法,不同的子類給出不同的實現(xiàn)版本

抽象類:在抽象類中聲明的抽象方法必須要在子類中實現(xiàn),抽象方法不能被繼承

 class Employee(object, metaclass=ABCMeta):
 
    @abstractmethod
    def ……

查找替換:
/ 進(jìn)入末行模式,輸入查找內(nèi)容 小寫n往下搜索,大寫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),同時忽略大小寫(i:ignore case)

名詞:撲克 玩家 牌
動詞:洗牌 發(fā)牌 摸牌

類和類之間(對象之間)的關(guān)系:

  1. is-a關(guān)系 - 繼承
  2. has-a關(guān)系 - 關(guān)聯(lián)(學(xué)生有筆記本電腦)/聚合/合成 ((強(qiáng)關(guān)聯(lián))小汽車有引擎:聚合或者合成)
  3. use-a關(guān)系 - 依賴

面向?qū)ο笃邆€設(shè)計原則:

1.單一職責(zé)原則 - 一個類只做該做的事情,不做不該做的事情
2.開閉原則
3.依賴倒轉(zhuǎn)原則
4.里氏替換原則
5.接口隔離原則
6.合成聚合復(fù)用原則 - 優(yōu)先考慮強(qiáng)關(guān)聯(lián)關(guān)系而不是繼承關(guān)系來復(fù)用代碼
7.最少知識原則(迪米特法則)

設(shè)計模式:
GoF設(shè)計模式(23種經(jīng)典場景,有17種在python中被弱化了(因為是動態(tài)弱類型語言))

!經(jīng)驗: 符號常量優(yōu)于字面常量,枚舉類型是定義符號常量的最佳選擇
SPADE.value可以取到常量的值,Suite是可以迭代的類型

class Suite(Enum):
     SPADE = 0
     HEART = 1
     CLUB = 2
     DIAMOND = 3

__repr__:
對象作為列表的元素時,打印自動調(diào)用__repr__

def func1(a, *, key='')
*前面的參數(shù)稱為位置參數(shù)(傳參時不用指定參數(shù)名,按位置對號入座即可)
*后面的參數(shù)稱為命名關(guān)鍵字參數(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):
    """銷售員"""

    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'請輸入{emp.name}本月工時:'))
            emp.working_hour = hour
        elif isinstance(emp, Salesman):
            sales = float(input(f'請輸入{emp.name}本月銷售額:'))
            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ōu)于字面常量,枚舉類型是定義符號常量的最佳選擇
# SPADE.value可以取到常量的值,Suite是可以迭代的類型
@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)系,又有依賴關(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()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,684評論 1 32
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,282評論 8 265
  • 不被理解是一種怎么樣的孤獨(dú),像剛從溫室跌進(jìn)一個無盡寒冬里,所有原本的棱角都頃刻磨碎········ 夜已深了,大概...
    小鐘鐘同學(xué)閱讀 1,088評論 0 0
  • 我發(fā)現(xiàn)人有時候是不長記性的,明知道那條路不好走,甚至根本就是一條錯路,但是還是一腳踏進(jìn)去,最后傷痕累累的出來,然而...
    纓Beryl閱讀 406評論 0 0
  • M: Honey, here is a bottle,one side is small, let's play ...
    大小豆豆MM閱讀 424評論 0 0

友情鏈接更多精彩內(nèi)容