python之路day5
鋪墊:
1、os模塊
os模塊中的system,使用os.system("dir")可直接輸出結果,如果將os.system("dir")賦值給一個變量,則這個變量接收的是這個命令執行成功與否,如果非0則執行不成功,0表示執行成功。
a=os.popen("dir").read()會保存命令輸出結果,並賦值給a,此時print(a)就可以輸出到屏幕
2、commands模塊:只使用於linux
正題:
subprocess.run([‘df‘,‘-h‘])
涉及到管道符的時候,subprocess.run(‘df -h | grp sda1‘,shell=True)
subprocess.getstatusoutput(‘ls /bin/ls‘)接收字符串格式命令,返回元組形式,第1個元素是執行狀態,第2個是命令結果即(0,‘/bin/ls‘)
其它方法如getoutput、check_output、check_call等不經常使用
以上方法,底層都是封裝的subprocess.Popen
例1:res=subprocess.Popen("ifconfig |grep 192",shell=Ture,stdout=subprocess.PIPE)此時是把命令執行結果保存在內存空間的管道中,如果想輸出到屏幕需要用res.stdout.read(),這裏存在命令輸入錯誤報錯的情況,如果報錯會把錯誤直接輸入到屏幕上,管道中為空。如要保存錯誤信息,需增加stderr=subprocess.PIPE字段,此時把錯誤信息也保存到了管道中。
在例1中如果命令執行耗時很長,如:res=subprocess.Popen("sleep 10;echo ‘hello‘",shell=Ture,stdout=subprocess.PIPE,stderr=subprocess.PIPE),當使用res.stdout.read()時會等待命令執行結束才能顯示,而poll方法可檢測命令是否執行結束,0表示執行結束,在編程時可與read結合使用,優化程序。同樣wait方法也是要等待程序執行。
例3:terminate()
該方法可以中斷執行,如:res=subprocess.Popen("sleep 10;echo ‘hello‘",shell=Ture,stdout=subprocess.PIPE,stderr=subprocess.PIPE)本需要10s才能執行完,並可以通過res.stdout.read()輸出到屏幕,如果中途使用res.terminate(),再調用read方法則為空。
- args:shell命令,可以是字符串或者序列類型
- cwd:用於設置子進程的當前目錄
- stdin,stdout,stderr:分別表示程序的標準輸入、輸出、錯誤句柄
- env:用於指定子進程的環境變量。如果env=None,子進程的環境變量將從父進程中繼承
面向對象
概念
OOP(object oriented programing)編程就是利用類和對象來創建各種模型來實現對真實世界的描述,面向對象編程可以使程序的維護和擴展更簡單,提高開發效率。
核心特性
- Class類:對一類相同屬性的抽象集合。
- Object對象:一個類的實例化後的實例,即調用類生成的實體。
- Encapsulation封裝:在類中對數據的賦值、內部調用對外部用戶是透明的,這使類變成了一個膠囊或容器,裏面包含著類的數據和方法。之所以要封裝是防止數據被隨意修改,並使外部程序方便快捷的調用,而無需關註內部構造。
- Inheritance繼承:一個類可以派生出子類,在這個父類裏定義的屬性、方法自動被子類繼承。
- Polymorphism多態:一個接口,多種實現。指一個基類中派生了不同的子類,且每個子類在繼承了同樣的方法名的同時又對父類的方法做了不同的實現,這就是同一種事物表現出的多種形態。
類的定義
class dog(object):
def __init__(self,name,food): #構造函數
self.NAME = name
self.FOOD = food
def sayhi(self):
print("Hi,i am a dog,my name is %s" %self.NAME)
def eat(self):
print("I like eat %s" %self.FOOD)
d1 = dog(‘Sanmao‘,‘apple‘)
d2 = dog(‘lisi‘,‘banana‘)
print(d1.NAME)
d2.sayhi()
d1.eat()
d2.eat()
繼承
被繼承的類稱為“基類”
代碼示例:
class Person(object):
def talk(self):
print("會說話")
class chinaperson(Person):
def walk(self):
print("會走路")
a = chinaperson()#實例a同時具有自己定義的屬性walk和從基類中繼承的屬性talk
a.talk()
a.walk()
具體應用:學校實例
import time
class ShoolMember(object):
member = 0
def __init__(self,name,age,sex):#構造函數
self.name = name
self.age = age
self.sex = sex
self.enroll()
def enroll(self):
‘‘‘註冊‘‘‘
print(‘enroll a new member‘,self.name)
ShoolMember.member += 1
def tell(self):
print(‘--------------info %s----------------‘%self.name)
for a,v in self.__dict__.items():
print(‘\t‘,a,v)
def __del__(self):#析構函數,在程序運行結束後自動執行,手動刪除s2,運行結束後自動刪除t1和s1
print(‘開除了‘,self.name)
ShoolMember.member -=1
class Teacher(ShoolMember):
def __init__(self,name,age,sex,salary,course):#先繼承,再重構
ShoolMember.__init__(self,name,age,sex) #經典類寫法
#super(Teacher,self).__init__(name,age,sex)新式類寫法
self.salary = salary
self.course = course
def teaching(self):
print(‘%s is teaching %s‘%(self.name,self.course))
class Student(ShoolMember):
def __init__(self,name,age,sex,course,tuition):
ShoolMember.__init__(self,name,age,sex)
self.course = course
self.tuition =tuition
def study(self):
print(‘%s is studing %s,course is %s‘%(self.name,self.course,self.tuition))
t1 = Teacher(‘zhangsan‘,30,‘F‘,30000,‘python‘)
s1 = Student(‘lisi‘,24,‘M‘,‘python‘,11000)
s2 = Student(‘wangwu‘,18,‘M‘,‘python‘,11000)
#print(s1.__dict__)使用該方法可以獲取實例的所有參數,即可在tell函數中使用該方法
t1.tell()
s1.tell()
print(‘學校總人數‘,ShoolMember.member)
del s2
print(‘學校總人數‘,ShoolMember.member)
time.sleep(5)
# t1.teaching()
# s1.study()
經典類與新式類
class A(object):
def __init__(self):
self.n = ‘A‘
class B(A):
pass
# def __init__(self):
# self.n = ‘B‘
class C(A):
def __init__(self):
self.n = ‘C‘
class D(B,C):
pass
# def __init__(self):
# self.n = ‘D‘
‘‘‘
D繼承B、C,B、C繼承A
正常情況下print(D().n)輸出的是D
如果class D修改成pass,輸出的是B
如果class B修改成pass,輸出的是C
如果class C修改成pass,輸出的是A
此查詢方法稱之為廣度查詢,即先查詢同級的B、C,都查不到的情況下才查上級A
以上方法為新式類寫法
如果把class A修改為經典類寫法,其它保持不變,並在python2環境中運行(在python3環境中也遵循廣度查詢法)
class A:
def __init__(self):
self.n = ‘A‘
則遵循深度查詢
‘‘‘
print(D().n)
python之路day5