#!/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('光輝女郎')
一起學Python吧~Day10
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.