一起學Python吧~Day10

#!/bin/env python3
#-*- coding:utf8 -*-
#學python3的第十天
"""

## OOP:面向對象編程

- 實現了數據屬性和行爲屬性的融合
- 類:具有相同屬性的對象集合
- 實例/對象:類的一個具體實現
- 方法:就是在類中定義的函數

### 組合

- 兩個類有明顯的不同
- 一個類的屬性是另一個類的實例,用組合

### 子類

- 兩個類非常相似,只是有一些不同
- 通過一個類派生出另一個類,也可以說一個類繼承於另一個類

### 多重繼承

- 子類可以有多個父類
- 子類自動繼承所有父類的方法
- 對象查找方法時,按自下向上、自左向右的方式查找

### 特殊方法

- 爲了實現類的內部功能,python定義了很多以雙下劃線開頭、結尾的方法
- 這些方法被稱作magic魔法方法

## 正則表達式

```shell
# 爲MAC地址加冒號
192.168.1.1     000C29123456
192.168.1.2     5254A3802B32

:%s/\(..\)\(..\)\(..\)\(..\)\(..\)\(..\)$/\1:\2:\3:\4:\5:\6/
"""

#完全備份和增量備份程序
"""
(nsd1906) [root@room8pc16 day03]# mkdir -p /tmp/demo/backup
(nsd1906) [root@room8pc16 day03]# cp -r /etc/security /tmp/demo/
"""
# import os
# import tarfile
# import pickle
# import hashlib
# from time import  strftime
#
# def check_md5(fname): #思考
#     '計算文件md5值的函數,接受文件名 返回md5值'
#     m = hashlib.md5()
#
#     with open(fname,'rb') as fobj:
#         while 1:
#             data = fobj.read(4096)
#             if not data:
#                 break
#             m.update(data)
#
#     return m.hexdigest()
#
# def full_backup(src,dst,md5file):
#     #拼接處備份文件名的絕對路徑
#     fname = os.path.basename(src)
#     fname = '%s_full_%s.tar.gz' % (fname,strftime('%Y%m%d'))
#     fname = os.path.join(dst, fname)
#
#     #完全備份,就是把整個目錄壓縮
#     tar = tarfile.open(fname,'w:gz')
#     tar.add(src)
#     tar.close()
#
#     #計算每個文件的md5值
#     md5dict = {}
#     for path,folders,files in os.walk(src):
#         for file in files:
#             key = os.path.join(path,file)
#             md5dict[key] = check_md5(key)
#
#     #將md5值存入文件
#     with open(md5file,'wb') as fobj:
#         pickle.dump(md5dict,fobj)
#
# def incr_backup(src,dst,md5file):
#     # 拼接出備份文件的絕對路徑
#     fname = os.path.basename(src)
#     fname = '%s_incr_%s.tar.gz' % (fname,strftime('%Y%m%d'))
#     fname = os.path.join(dst, fname)
#
#     # 計算每個文件的md5值
#     md5dict = {}
#     for path, folders, files in os.walk(src):
#         for file in files:
#             key = os.path.join(path, file)
#             md5dict[key] = check_md5(key)
#
#     #取出前一天的md5值
#     with open(md5file,'rb') as fobj:
#         old_md5 = pickle.load(fobj)
#
#     #找出新增文件和改動的文件進行備份
#     tar = tarfile.open(fname, 'w:gz')
#     for key in md5dict:
#         if md5dict[key] != old_md5.get(key):
#             tar.add(key)
#     tar.close()
#
#     #更新md5文件
#     with open(md5file,'wb') as fobj:
#         pickle.dump(md5dict,fobj)
#
# if __name__ == '__main__':
#     src = '/tmp/demo/security'
#     dst = '/tmp/demo/backup'
#     md5file = '/tmp/demo/backup/md5.data'
#     if strftime('%a') == 'Mon':
#         full_backup(src,dst,md5file)
#     else:
#         incr_backup(src,dst,md5file)

#OOP:面向對象編程
"""
- 實現了數據屬性和行爲屬性的融合
- lib:具有相同屬性的對象集合
- 實例/對象:lib的一個具體實現
- 方法:就是在類中定義的函數
"""
# #文字遊戲:
# class Warrior: #戰士
#     def __init__(self,name,weapon):
#         'self不是關鍵字,可以是任何名字,表示實例本身'
#         #綁定在對象身上的屬性 再類中任意位置可用
#         self.name = name
#         self.weapon = weapon
#
#     def speak(self,words):
#         #方法自己的參數、變量就是函數的局部變量
#         print('我是%s,%s' % (self.name,words))
#
#     def attack(self,target):
#         print('正在攻擊:%s' % target)
#
# class Weapon:
#     def __init__(self,name,strength,type):
#         self.name = name
#         self.strength = strength
#         self.type = type
#
"""組合
- 兩個類有明顯的不同
- 一個類的屬性是另一個類的實例,用組合
"""
# if __name__ == '__main__':
#     #創建實例時 自動調用__init__方法,實例自動作爲第一個參數
#     ji = Weapon('方天畫戟','力量:88','物理傷害')
#     lb = Warrior('呂布','方天畫戟') #創建實例
#     lb = Warrior('呂布',ji)
#     print(lb.name)
#     print(lb.weapon.name,lb.weapon.strength,lb.weapon.type)
#     lb.speak('馬中赤兔,人中呂布')
#     print('*'*30)
#     zf = Warrior('張飛',"丈八蛇矛")
#     print(zf.name,zf.weapon)
#     zf.speak('我是閹人張飛張翼德')
#     print('*'*30)
#     lb.attack('董卓')
#     zf.attack('呂布')

# #多重繼承(先看本體 再看繼承 自左向右 自下向上)
# class A:
#     def func1(self):
#         print('A func')
#
#
# class B:
#     def func2(self):
#         print('B func')
#     def func4(self):
#         print('B func4')
#
#
# class C(A, B,):
#     def func3(self):
#         print('C func')
#     def func4(self):
#         print('C func4')
#
#
#
# if __name__ == '__main__':
#     c1 = C()
#     c1.func1()
#     c1.func2()
#     c1.func3()
#     c1.func4()


# #實例用法
# class Book:
#     def __init__(self,title,author):
#         self.title = title
#         self.author = author
#
#     def __str__(self):
#         return '《%s》' % self.title
#
#     def __call__(self):
#         print('《%s》是%s編寫的'% (self.title,self.author))
#
#
# if __name__ == '__main__':
#     pybook = Book('Python基礎教程','Magnus') #調用__init__
#     print(pybook) #調用__str__
#     pybook() #調用__call__
#
#正則表達式
#給mac地址加冒號
"""vim中使用
%s/(..)(..)(..)(..)(..)(..)/\1:\2:\3:\4:\5:\6/
"""


#*************************複習一天所學********************************
# #完全備份/增量備份程序
# import os
# import tarfile
# import hashlib
# import pickle
# from time import strftime
#
# def check_md5(fname):
#     '計算文件md5值的函數,接收文件名,返回md5'
#     m = hashlib.md5()
#
#     with open(fname,'rb') as fobj:
#         while 1:
#             data = fobj.read(4096)
#             if not data:
#                 break
#             m.update(data)
#
#     return m.hexdigest()
#
# def full_backup(src,dst,md5file):
#     #拼接出備份文件的絕對路徑
#     fname = os.path.basename(src)
#     fname = '%s_full_%s.tar.gz' % (fname,strftime('%Y%m%d'))
#     fname = os.path.join(dst,fname)
#
#     #完全備份,就是把整個目錄壓縮
#     tar = tarfile.open(fname,'w:gz')
#     tar.add(src)
#     tar.close()
#
#     #計算每個文件的md5值
#     md5dict = {}
#     for payh,folders,files in os.walk(src):
#         for file in files:
#             key = os.path.join(payh,file)
#             md5dict[key] = check_md5(key)
#
#     #將md5值存入文件
#     with open(md5file,'wb')as fobj:
#         pickle.dump(md5dict,fobj)
#
# def incr_backup(src,dst,md5file):
#     #憑藉出備份文件的絕對路徑
#     fname = os.path.basename(src)
#     fname = '%s_incr_%s.tar.gz' % (fname,strftime('%Y%m%d'))
#     fname = os.path.join(dst,fname)
#
#     #計算每個文件的md5值
#     md5dict = {}
#     for path,folders,files in os.walk(src):
#         for file in files:
#             key = os.path.join(path,file)
#             md5dict[key] = check_md5(key)
#
#     #取出前一天的md5值
#     with open(md5file,'rb')as fobj:
#         old_md5 = pickle.load(fobj)
#
#     #找出新增文件和改動文件進行備份
#     tar = tarfile.open(fname,'w:gz')
#     for key in md5dict:
#         if md5dict[key] != old_md5.get(key):
#             tar.add(key)
#     tar.close()
#
#     #更新md5文件
#     with open(md5file,'wb') as fobj:
#         pickle.dump(md5dict,fobj)
#
# if __name__ == '__main__':
#     src = '/tmp/demo/security'
#     dst = '/tmp/demo/backup'
#     md5file = '/tmp/demo/backup/md5.data'
#     if strftime('%a') != 'Mon':
#         full_backup(src, dst,md5file)
#     else:
#         incr_backup(src,dst,md5file)

# class Book:
#     def __init__(self,title,author):
#         self.title = title
#         self.author = author
#
#     def __str__(self):
#         return '《%s》' % self.title
#
#     def __call__(self):
#         print('《%s》是%s編寫的' % (self.title,self.author))
#
# if __name__ == '__main__':
#     pybook = Book("Python基礎教程",'Magnus') #調用__init__
#     print(pybook) #調用 __str__
#     pybook()  #調用__call__

# class A:
#     def __init__(self, a, b, c, d):
#         self.a = a
#         self.b = b
#         self.c = c
#         self.d = d
#
# class B(A):
#     def __init__(self, a, b, c, d, e):
#         # 調用父類方法進行初始化
#         # A.__init__(self, a, b, c, d)  # 與下面寫法等價
#         super(B, self).__init__(a, b, c, d)
#         self.e = e
#
# if __name__ == '__main__':
#     b1 = B(10, 20, 30, 40, 50)
#     print(b1.a, b1.e)

# class A:
#     def func1(self):
#         print('A func')
#
#     def func4(self):
#         print('AAAAAAAAAAAAA func4')
#
# class B:
#     def func2(self):
#         print('B func')
#
#     def func4(self):
#         print('BBBBBBBBBBBBB func4')
#
# class C(B, A):
#     def func3(self):
#         print('C func')
#
#     def func4(self):
#         print('CCCCCCCCCCCCC func4')
#
# if __name__ == '__main__':
#     c1 = C()
#     c1.func1()
#     c1.func2()
#     c1.func3()
#     c1.func4()

# class A:
#     def __init__(self, a, b, c, d):
#         self.a = a
#         self.b = b
#         self.c = c
#         self.d = d
#
# class B(A):
#     def __init__(self, a, b, c, d, e):
#         # 調用父類方法進行初始化
#         # A.__init__(self, a, b, c, d)  # 與下面寫法等價
#         super(B, self).__init__(a, b, c, d)
#         self.e = e
#
# if __name__ == '__main__':
#     b1 = B(10, 20, 30, 40, 50)
#     print(b1.a, b1.e)

# class Warrior:
#     def __init__(self, name, weapon):
#         'self不是關鍵字,可以是任何名字,表示實例本身'
#         # 綁定在對象身上的屬性,在類中任意位置可用
#         self.name = name
#         self.weapon = weapon
#
#     def speak(self, words):
#         # 方法自己的參數、變量就是函數的局部變量
#         print('我是%s, %s' % (self.name, words))
#
#     def attack(self, target):
#         print('正在攻擊: %s' % target)
#
# if __name__ == '__main__':
#     # 創建實例時,自動調用__init__方法,實例自動作爲第一個參數
#     lb = Warrior('呂布', '方天畫戟')  # 創建實例
#     print(lb.name)
#     print(lb.weapon)
#     lb.speak('馬中赤兔,人中呂布')
#     print('*' * 30)
#     zf = Warrior('張飛', '丈八蛇矛')
#     print(zf.name, zf.weapon)
#     zf.speak('我是燕人張飛張冀德')
#     print('*' * 30)
#     lb.attack('董卓')
#     zf.attack('呂布')

# class Role:
#     def __init__(self, name, weapon):
#         self.name = name
#         self.weapon = weapon
#
#     def speak(self, words):
#         print('我是%s, %s' % (self.name, words))
#
#     def attack(self, target):
#         print('正在攻擊: %s' % target)
#
# class Warrior(Role):
#     '子類可以繼承父類(基類)的所有方法'
#     def move(self):
#         print('陸地移動')
#
# class Mage(Role):
#     pass
#
# if __name__ == '__main__':
#     lb = Warrior('呂布', '方天畫戟')
#     lj = Mage('李靖', '寶塔')
#     lb.speak('馬中赤兔,人中呂布')
#     lj.speak('寶塔鎮河妖')
#     lb.move()

#子類父類用法(非常實用的縮減代碼量方式)
"""子類
- 兩個類非常相似,只是有一些不同
- 通過一個類派生出另一個類,也可以說一個類繼承於另一個類
"""
# a = '='*30
#
# class Game:
#     def __init__(self,title,author):
#         self.title = title
#         self.author = author
#
#     def __str__(self):
#         return '\033[34;1m《%s》' % self.title
#
#     def __call__(self):
#         print('\033[34;1m《%s》是%s編寫的文字小遊戲\033[0m' % (self.title,self.author))
#
# class Role:
#     def __init__(self,name,weapon,state):
#         self.name = name
#         self.weapon = weapon
#         self.state = state
#
#     def speak(self,words):
#         print('\033[35;1m我是%s,%s\033[0m' % (self.name,words))
#
#     def attack(self,target):
#         print('\033[31;2m正在攻擊:%s...\033[0m' % target)
#
# class Weapon:
#     def __init__(self,name,strength,type):
#         self.name = name
#         self.strength = strength
#         self.type = type
#
# class State:
#     def __init__(self,value1,value2):
#         self.blood = value1
#         self.magic = value2
#
#
#
# class Warrior(Role,Weapon,State):
#     '子類可以繼承父類(基類)的所有方法'
#     pass
#
# class Mager(Role,Weapon,State):
#     pass
#
# class Archer(Role,Weapon,State):
#     pass
#
#
# if __name__ == '__main__':
#     pygame = Game("\033[34;1m三國文字殺",'csdnak') #調用__init__
#     print(pygame) #調用__str__
#     pygame() #調用__call__
#
#     q = Weapon('\033[33;1m臥龍槍','力量72','物理攻擊\033[0m')
#     state = State('\033[31;1m[血量:120%\033[0m','\033[34;1m魔法:100%]\033[0m')
#     zx = Warrior('\033[32;1m趙信\033[0m',q,state)
#     print('[%s]'% a)
#     print(zx.name,end='')
#     print(zx.state.blood,zx.state.magic)
#     print(zx.weapon.name,zx.weapon.strength,zx.weapon.type,sep='-')
#     zx.speak('\033[35;1m槍出龍爐,兔死狗烹!')
#     print('[%s]'% a)
#     zx.attack('呂布')
#
#
#     b = Weapon('\033[33;1m魔法棒','法術85','魔法攻擊\033[0m')
#     state = State('\033[31;1m[血量:100%\033[0m','\033[34;1m魔法:150%]\033[0m')
#     gh = Mager('\033[32;1m光輝女郎\033[0m',b,state)
#     print('[%s]' % a)
#     print(gh.name,end='')
#     print(gh.state.blood, gh.state.magic)
#     print(gh.weapon.name,gh.weapon.strength,gh.weapon.type,sep='-')
#     gh.speak('\033[35;1m美貌與天下並存!')
#     print('[%s]' % a)
#     zx.attack('趙信')
#
#
#     g = Weapon('\033[33;1m霸王弓','射程100','遠程攻擊\033[0m')
#     state = State('\033[31;1m[血量:100%\033[0m','\033[34;1m魔法:140%]\033[0m')
#     hb = Archer('\033[32;1m寒冰射手\033[0m',g,state)
#     print('[%s]' % a)
#     print(hb.name,end='')
#     print(hb.state.blood, hb.state.magic)
#     print(hb.weapon.name,hb.weapon.strength,hb.weapon.type,sep='-')
#     hb.speak('\033[35;1m霸王硬上弓,美女變婦女!')
#     print('[%s]' % a)
#     hb.attack('光輝女郎')


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章