美文网首页
Linux vim编辑器-录制宏 python面向对象

Linux vim编辑器-录制宏 python面向对象

作者: 莫名ypc | 来源:发表于2018-11-15 21:10 被阅读0次

面向对象的四大支柱:抽象、封装、继承、多态

抽象:定义类的过程就是提取共性的抽象过程
数据抽象:找到对象的静态特征 - 属性 - 找名词
行为抽象:找到对象的动态特征 - 方法 - 找动词

封装:将数据和操作数据的方法从逻辑上组成一个整体 - 对象
隐藏实现细节,暴露简单的调用接口

继承:从已有的类创建新类的过程
提供继承信息的称之为父类,得到继承信息的称之为子类

多态:调用相同的方法,做了不同的事情 - 同样的方法在运行时表现出不同的行为
子类重写父类方法,不同子类给出不同的实现版本

类和类之间(对象之间)的关系:

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

相关文章

网友评论

      本文标题:Linux vim编辑器-录制宏 python面向对象

      本文链接:https://www.haomeiwen.com/subject/eobefqtx.html