面向對象-1
一、概述:
定義:
面向對象程序設計(英語:Object-oriented programming,縮寫:OOP)是一種程序設計範型,同時也是一種程序開發的方法。對象指的是類的實例。
它將對象作為程序的基本單元,將程序和數據封裝其中,以提高軟件的重用性、靈活性和擴展性。
面向對象程序設計可以看作一種在程序中包含各種獨立而又互相調用的對象的思想,
這與傳統的思想剛好相反:傳統的程序設計主張將程序看作一系列函數的集合,或者直接就是一系列對電腦下達的指令。
面向對象程序設計中的每一個對象都應該能夠接受數據、處理數據並將數據傳達給其它對象,因此它們都可以被看作一個小型的“機器”,即對象。
1)面向過程的程序設計:核心是過程二字,過程指的是解決問題的步驟,是一種機械式的思維方式。
優點:
復雜度的問題流程化,進而簡單化(一個復雜的問題,分成一個個小的步驟去實現,實現小的步驟將會非常簡單)
缺點:
一套流水線或者流程就是用來解決一個問題,生產汽水的流水線無法生產汽車,即便是能,也得是大改,改一個組件,牽一發而動全身。
應用場景:
一旦完成基本很少改變的場景,著名的例子有Linux內核,git,以及Apache HTTP Server等。
2)面向對象的程序設計:
核心是對象二字,對象是特征與技能的結合體,
優點:
解決了程序的擴展性。對某一個對象單獨修改,會立刻反映到整個體系中,如對遊戲中一個人物參數的特征和技能修改都很容易。
缺點:
1>編程的復雜度遠高於面向過程,不了解面向對象而立即上手基於它設計程序,極容易出現過度設計的問題。
2.>無法向面向過程的程序設計流水線似的可以很精準的預測問題的處理流程與結果,面向對象的程序一旦開始就由對象之間的交互解決問題。
應用場景:需求經常變化的軟件,一般需求的變化都集中在用戶層,互聯網應用,企業內部軟件,遊戲等。
面向過程思想:
while 1:
if cpu利用率 > 90%:
#發送郵件提醒
連接郵箱服務器
發送郵件
關閉連接
if 硬盤使用空間 > 90%:
#發送郵件提醒
連接郵箱服務器
發送郵件
關閉連接
if 內存占用 > 80%:
#發送郵件提醒
連接郵箱服務器
發送郵件
關閉連接
面向對象思想:
def 發送郵件(內容)
#發送郵件提醒
連接郵箱服務器
發送郵件
關閉連接
while True:
if cpu利用率 > 90%:
發送郵件(‘CPU報警‘)
if 硬盤使用空間 > 90%:
發送郵件(‘硬盤報警‘)
if 內存占用 > 80%:
發送郵件(‘內存報警‘)
二、類和對象
面向對象編程是一種編程方式,此編程方式的落地需要使用 “類” 和 “對象” 來實現,所以,面向對象編程其實就是對 “類” 和 “對象” 的使用。
對象=屬性+行為(方法)
把具有相同屬性和方法的對象歸為一類。類是對象的抽象化,對象是類的實例化。
類就是一個模板,模板裏可以包含多個函數,函數裏實現一些功能,對象則是根據模板創建的實例,通過實例對象可以執行類中的函數。
self指的是類實例對象本身(註意:不是類本身),在定義類的實例方法時必須寫在第一個參數位置上,但在調用該實例方法時不必傳入。
__init__()方法是在實例對象時自動執行的方法,叫構造方法;self.Name ,Addr, Type 都是實例對象的屬性。
class Person:
def __init__(self, name ,age ,blood_type):
self.name = name
self.age = age
self.blood_type = blood_type
def detail(self):
temp = "i am %s, age %s , blood type %s " % (self.name, self.age, self.blood_type)
print temp
zhangsan = Person(‘tom‘, 18, ‘A‘)
lisi = Person(‘jerry‘, 73, ‘AB‘)
yangwu = Person(‘laowang‘, 84, ‘A‘)
__init__方法:
#方式一、為對象初始化自己獨有的特征
class People:
country=‘China‘
x=1
def run(self):
print(‘----->‘, self)
# 實例化出三個空對象
obj1=People()
obj2=People()
obj3=People()
# 為對象定制自己獨有的特征
obj1.name=‘jerry‘
obj1.age=18
obj1.sex=‘male‘
obj2.name=‘xxx‘
obj2.age=38
obj2.sex=‘female‘
obj3.name=‘tom‘
obj3.age=38
obj3.sex=‘female‘
# print(obj1.__dict__)
# print(obj2.__dict__)
# print(obj3.__dict__)
# print(People.__dict__)
#方式二、為對象初始化自己獨有的特征
class People:
country=‘China‘
x=1
def run(self):
print(‘----->‘, self)
# 實例化出三個空對象
obj1=People()
obj2=People()
obj3=People()
# 為對象定制自己獨有的特征
def chu_shi_hua(obj, x, y, z):
obj.name = x
obj.age = y
obj.sex = z
chu_shi_hua(obj1,‘jerry‘,18,‘male‘)
chu_shi_hua(obj2,‘xxx‘,38,‘female‘)
chu_shi_hua(obj3,‘tom‘,38,‘female‘)
#方式三、為對象初始化自己獨有的特征
class People:
country=‘China‘
x=1
def chu_shi_hua(obj, x, y, z):
obj.name = x
obj.age = y
obj.sex = z
def run(self):
print(‘----->‘, self)
obj1=People()
# print(People.chu_shi_hua)
People.chu_shi_hua(obj1,‘jerry‘,18,‘male‘)
obj2=People()
People.chu_shi_hua(obj2,‘xxx‘,38,‘female‘)
obj3=People()
People.chu_shi_hua(obj3,‘tom‘,38,‘female‘)
# 方式四、為對象初始化自己獨有的特征
class People:
country=‘China‘
x=1
def __init__(obj, x, y, z):
obj.name = x
obj.age = y
obj.sex = z
def run(self):
print(‘----->‘, self)
obj1=People(‘jerry‘,18,‘male‘)
obj2=People(‘xxx‘,38,‘female‘)
obj3=People(‘tom‘,38,‘female‘)
# __init__方法
# 強調:
# 1、該方法內可以有任意的python代碼
# 2、一定不能有返回值
class People:
country=‘China‘
x=1
def __init__(obj, name, age, sex):
# if type(name) is not str:
# raise TypeError(‘名字必須是字符串類型‘)
obj.name = name
obj.age = age
obj.sex = sex
def run(self):
print(‘----->‘, self)
# obj1=People(‘jerry‘,18,‘male‘)
obj1=People(3537,18,‘male‘)
# print(obj1.run)
# obj1.run() #People.run(obj1)
# print(People.run)
!!!__init__方法之為對象定制自己獨有的特征
View Code
*****
#1、在沒有學習類這個概念時,數據與功能是分離的
def exc1(host,port,db,charset):
conn=connect(host,port,db,charset)
conn.execute(sql)
return xxx
def exc2(host,port,db,charset,proc_name)
conn=connect(host,port,db,charset)
conn.call_proc(sql)
return xxx
#每次調用都需要重復傳入一堆參數
exc1(‘127.0.0.1‘,3306,‘db1‘,‘utf8‘,‘select * from tb1;‘)
exc2(‘127.0.0.1‘,3306,‘db1‘,‘utf8‘,‘存儲過程的名字‘)
#2、我們能想到的解決方法是,把這些變量都定義成全局變量
HOST=‘127.0.0.1’
PORT=3306
DB=‘db1’
CHARSET=‘utf8’
def exc1(host,port,db,charset):
conn=connect(host,port,db,charset)
conn.execute(sql)
return xxx
def exc2(host,port,db,charset,proc_name)
conn=connect(host,port,db,charset)
conn.call_proc(sql)
return xxx
exc1(HOST,PORT,DB,CHARSET,‘select * from tb1;‘)
exc2(HOST,PORT,DB,CHARSET,‘存儲過程的名字‘)
#3、但是2的解決方法也是有問題的,按照2的思路,我們將會定義一大堆全局變量,這些全局變量並沒有做任何區分,即能夠被所有功能使用,然而事實上只有HOST,PORT,DB,CHARSET是給exc1和exc2這兩個功能用的。言外之意:我們必須找出一種能夠將數據與操作數據的方法組合到一起的解決方法,這就是我們說的類了
class MySQLHandler:
def __init__(self,host,port,db,charset=‘utf8‘):
self.host=host
self.port=port
self.db=db
self.charset=charset
def exc1(self,sql):
conn=connect(self.host,self.port,self.db,self.charset)
res=conn.execute(sql)
return res
def exc2(self,sql):
conn=connect(self.host,self.port,self.db,self.charset)
res=conn.call_proc(sql)
return res
obj=MySQLHandler(‘127.0.0.1‘,3306,‘db1‘)
obj.exc1(‘select * from tb1;‘)
obj.exc2(‘存儲過程的名字‘)
#改進
class MySQLHandler:
def __init__(self,host,port,db,charset=‘utf8‘):
self.host=host
self.port=port
self.db=db
self.charset=charset
self.conn=connect(self.host,self.port,self.db,self.charset)
def exc1(self,sql):
return self.conn.execute(sql)
def exc2(self,sql):
return self.conn.call_proc(sql)
obj=MySQLHandler(‘127.0.0.1‘,3306,‘db1‘)
obj.exc1(‘select * from tb1;‘)
obj.exc2(‘存儲過程的名字‘)
數據與專門操作該數據的功能組合到一起
View Code面向對象-1