oop就是代碼的重用,通過分解代碼,最小化代碼的冗余以及對(duì)現(xiàn)存的代碼進(jìn)行定制來編寫程序;OOP模型中有兩種對(duì)象,類對(duì)象和實(shí)例對(duì)象。類對(duì)象提供默認(rèn)行為,是生產(chǎn)實(shí)例對(duì)象的工廠;類對(duì)象和實(shí)例對(duì)象都有各自命名空間。
十多年的忻府網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都營(yíng)銷網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整忻府建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)建站從事“忻府網(wǎng)站設(shè)計(jì)”,“忻府網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。? class語句創(chuàng)建類對(duì)象并將其賦值給變量名
? class語句內(nèi)的頂層賦值語句會(huì)創(chuàng)建類的屬性
? 類屬性提供對(duì)象的狀態(tài)和行為
? 每次類調(diào)用時(shí),都會(huì)創(chuàng)建并返回新的實(shí)例對(duì)象
? 每個(gè)實(shí)例對(duì)象繼承類的屬性并獲得了自己的命名空間
? 每個(gè)實(shí)例對(duì)象通過構(gòu)造方法獲得每個(gè)實(shí)例自己的屬性
封裝,是將對(duì)象的數(shù)據(jù)與操作數(shù)據(jù)的方法相結(jié)合,通過方法將對(duì)象的數(shù)據(jù)與實(shí)現(xiàn)細(xì)節(jié)保護(hù)起來,就稱為封裝。外界只能通過對(duì)象的方法訪問對(duì)象,因此封裝同時(shí)也實(shí)現(xiàn)了對(duì)象的數(shù)據(jù)隱藏
class Person():
#類的屬性--靜態(tài)屬性
country="China"
#封裝--初始化方法
def __init__(self,*args):
self.name=args[0]
self.age=args[1]
self.aggr=args[2]
self.sex=args[3]
#方法
def walk(self,n):
print("%szoule%sbu"%(self.name,n))
#調(diào)用類創(chuàng)建實(shí)例對(duì)象,自動(dòng)執(zhí)行構(gòu)造方法__init__
jonny=Person('jonny',11,23,'man')
#實(shí)例對(duì)象調(diào)用類的方法
jonny.walk(10)
#實(shí)例對(duì)象調(diào)用類的屬性
print(jonny.country)
類可以通過繼承進(jìn)行定制;類的繼承豐富了軟件的層級(jí),在層級(jí)較低的地方覆蓋現(xiàn)有的屬性,讓其行為特定化。
在python中,實(shí)例對(duì)象從類中繼承,而類繼承于超類
? 超類寫在類開頭的括號(hào)中
? 類從其超類中繼承屬性
? 實(shí)例會(huì)繼承所有可讀取類的屬性
? 每次實(shí)例對(duì)象的屬性調(diào)用都會(huì)進(jìn)行類樹搜索
? 邏輯的修改是通過創(chuàng)建子類,而不是修改超類
#創(chuàng)建父類---經(jīng)典類
class a():
a1="11"
#創(chuàng)建子類,繼承父類a
class b(a):
b1="22"
#調(diào)用父類的屬性
print(b.a1)
以上的例子中父類是經(jīng)典類,因?yàn)楦割愇蠢^承object類;繼承object類的父類是新式類
在python3之后,所有類默認(rèn)繼承object類,就是說所有類都是新式類。
#創(chuàng)建父類---新式類
class a(object):
a1="11"
#創(chuàng)建子類,繼承父類a
class b(a):
b1="22"
#調(diào)用父類的屬性
print(b.a1)
在繼承中,父類是經(jīng)典類那么子類就是經(jīng)典類;父類是新式類,子類就是新式類,Python3之后,所有類都是新式類
python支持繼承多個(gè)類,那么在繼承父類的屬性和方法時(shí)改怎么找呢?
class D(object):
def display(self):
print('D.display')
class C(D):
def display(self):
print('C.display')
class B(D):
def display(self):
print('B.display')
class A(B,C):
def display(self):
print('A.display')
a=A()
a.display()
多繼承中,子類的對(duì)象調(diào)用一個(gè)方法,默認(rèn)是就近原則,在python2.7之前的經(jīng)典類中是深度優(yōu)先,在python3之后的新式類中是廣度優(yōu)先。
執(zhí)行display方法時(shí),查找順序?yàn)?A--B--C--D
類的多態(tài)性是指具有不同功能的函數(shù)可以使用相同的函數(shù)名,這樣就可以用一個(gè)函數(shù)名調(diào)用不同內(nèi)容的函數(shù)。
class Person():
def display(self):
pass
class Man(Person):
def display(self):
print("man")
class Woman(Person):
def display(self):
print("woman")
def func(obj):
obj.display()
#實(shí)例化對(duì)象
man1=Man()
woman1=Woman()
#多態(tài)
func(man1)
func(woman1)
一個(gè)對(duì)象的屬性值是另外一個(gè)類的對(duì)象
class Birthday():
def __init__(self,year,month,day):
self.year=year
self.month=month
self.day=day
class Person():
def __init__(self,name,age,birthday):
self.name=name
self.age=age
self.birthday=birthday
bd=Birthday(2019,11,11)
jonny=Person("jonny",20,bd)
#組合調(diào)用
print(jonny.birthday.year)
父類中沒有的屬性,在子類中出現(xiàn),叫做派生屬性
父類中沒有的方法,在子類中出現(xiàn),叫做派生方法
class Person(object):
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
def eat(self):
print("eatfood")
class Teacher(Person):
def __init__(self,name,age,sex,school,cls):
Person.__init__(self,name,age,sex)
#派生方法
def score(self):
print("teacherscore")
def eat(self):
print("teachereating")
t1=Teacher("adc",42,"man","127","python1ban")
print(t1.name)
#傳入類和對(duì)象,調(diào)用父類的方法
super(Teacher,t1).eat()
接口類與抽象類的不同點(diǎn):
接口類:支持多繼承,接口類中的所有的方法都必須不能實(shí)現(xiàn);python中沒有接口類,java沒有多繼承,所以為了接口隔離原則,設(shè)計(jì)了接口這個(gè)概念
抽象類:不支持多繼承,抽象類中的方法可以有一些代碼的實(shí)現(xiàn);python自帶多繼承,所以直接用class來實(shí)現(xiàn)接口類;python支持抽象類,一般情況下單繼承,java本來就有單繼承,所以就有了抽象類。
接口類與抽象類的相同點(diǎn):
1、都依賴abc模塊實(shí)現(xiàn)
2、都是面向?qū)ο蟮木幊桃?guī)范
3、接口類和抽象類都不能實(shí)例化
一般情況下,單繼承,能實(shí)現(xiàn)的功能是一樣的,所以在父類中可以有簡(jiǎn)單的基礎(chǔ)實(shí)現(xiàn)
多繼承的情況下,由于功能比較復(fù)雜,所以不容易抽象出相同的功能的具體實(shí)現(xiàn)寫在父類中
接口類的實(shí)現(xiàn):
from abc import abstractmethod,ABCMeta
class Payment(metaclass=ABCMeta):#元類,默認(rèn)的元類type
@abstractmethod
def pay(self,money):pass
#raiseNotImplemented#手動(dòng)拋異常,沒有實(shí)現(xiàn)這個(gè)方法
#規(guī)范:接口類或者抽象類都可以
#接口類:支持多繼承,接口類中的所有的方法都必須不能實(shí)現(xiàn)-----java
#抽象類:不支持多繼承,抽象類中的方法可以有一些代碼的實(shí)現(xiàn)-----java
class Wechatpay():
defpay(self,money):
print("微信支付了%s元"%money)
class Alipay():
defpay(self,money):
print("ali支付了%s元"%money)
def pay(pay_obj,money):#統(tǒng)一支付接口
pay_obj.pay(money)
wechat=Wechatpay()
ali=Alipay()
pay(ali,200)
接口類多繼承示例:
from abc import ABCMeta,abstractmethod
class Swim_Animal(metaclass=ABCMeta):
@abstractmethod
def swim(self):
pass
class Walk_Animal(metaclass=ABCMeta):
@abstractmethod
def walk(self):pass
class Fly_Animal(metaclass=ABCMeta):
@abstractmethod
def fly(self):pass
class Tiger(Walk_Animal,Swim_Animal):
def swim(self):pass
def walk(self):pass
class Swan(Walk_Animal,Swim_Animal,Fly_Animal):
def swim(self):pass
def walk(self):pass
def fly(self):pass
class Oldying(Walk_Animal,Fly_Animal):
def walk(self):pass
def fly(self):pass
抽象類示例:
from abc import abstractmethod,ABCMeta
class All_file(metaclass=ABCMeta):
@abstractmethod
def read(self):#規(guī)范子類必須有的方法
print("du")
@abstractmethod
def write(self):
print("xie")
class Doc(All_file):
def read(self):pass
def write(self):pass
classTxt(All_file):
def read(self):pass
def write(self):pass
class Ppt(All_file):
def read(self):print("pptdu")
def write(self):pass
p1=Ppt()
p1.read()
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。