99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁(yè)大數(shù)據(jù)時(shí)代不會(huì)面向?qū)ο螅隙▽W(xué)不好!簡(jiǎn)易的Python面向?qū)ο蠊ヂ詠?lái)啦
不會(huì)面向?qū)ο?,肯定學(xué)不好!簡(jiǎn)易的Python面向?qū)ο蠊ヂ詠?lái)啦
2021-01-22
收藏

來(lái)源:麥?zhǔn)寰幊?

作者:麥?zhǔn)?

1. 第一個(gè)類

面向?qū)ο蟮母拍?

設(shè)想一下,你如何開(kāi)發(fā)下面這個(gè)游戲:

不會(huì)面向?qū)ο?,肯定學(xué)不好!簡(jiǎn)易的Python面向?qū)ο蠊ヂ詠?lái)啦

很難想象,用簡(jiǎn)單的字符串,int, list等數(shù)據(jù)類型就能表達(dá)和開(kāi)發(fā)出這么復(fù)雜的游戲(實(shí)際上是可以的,只是很麻煩)。

更好的做法是使用面向?qū)ο蟮募夹g(shù)。這個(gè)游戲無(wú)非就是一個(gè)個(gè)對(duì)象互相打打殺殺!

編程是對(duì)現(xiàn)實(shí)世界的模擬,我們先來(lái)看看面向?qū)ο蟮膸讉€(gè)核心概念:

  • 類 - 模板,如人類
  • 實(shí)例 - 用模板造出的對(duì)象,如貂蟬
  • 屬性 - 是特征,如姓名
  • 方法 - 是行為,是技能,如攻擊

在早期的編程語(yǔ)言中,比如C語(yǔ)言中,是沒(méi)有面向?qū)ο蟮母拍畹?,所有的程序,不管多么?fù)雜,都是用數(shù)字,字符串等來(lái)表達(dá)的。那時(shí)候我們稱為面向過(guò)程編程。

面向過(guò)程編程:Procedure Oriented Programming 是一種以過(guò)程和任務(wù)為中心的編程思想。通過(guò)一系列具體的步驟操作相關(guān)的數(shù)據(jù),實(shí)現(xiàn)軟件功能。

面向?qū)ο缶幊?/span>

Object Oriented Programming 是一種以對(duì)象為基礎(chǔ)的編程思想。把數(shù)據(jù)和操作封裝到對(duì)象中,通過(guò)對(duì)象一系列的交互,實(shí)現(xiàn)軟件功能。

下面我用一個(gè)小的例子帶你理解面向?qū)ο蟆?

假設(shè)有兩條狗,他們分別有自己的名字,身高,血量和攻擊力。我們要模擬一條狗攻擊了另外一條狗。

面向過(guò)程的代碼可能是這樣的

#表示狗的屬性 dog1_name = '大黃'
dog1_height = 0.7
dog1_blood = 1.0
dog1_power = 0.1

dog2_name = '二黑'
dog2_height = 0.7
dog2_blood = 1.0
dog2_power = 0.2 #dog1攻擊dog2 print('dog1 attacking dog2')
dog2_blood = dog2_blood - dog1_power #dog2攻擊dog1 print('dog2 attacking dog1')
dog1_blood = dog1_blood - dog2_power

這顯然不好,如果有100條狗互相亂咬呢?

我們來(lái)看看面向?qū)ο蟮膶懛ǎ?

面向?qū)ο蟮拇a

#類是一個(gè)模板 class Dog:  #構(gòu)造方法  def __init__(self, name, height, blood, power):
  self.name = name
  self.height = height
  self.blood = blood
  self.power = power

 def attack(self, dog2):
  dog2.blood = dog2.blood - self.power

d1 = Dog('大黃'0.7103#創(chuàng)建第1個(gè)實(shí)例 d2 = Dog('二黑'0.5104#創(chuàng)建第2個(gè)實(shí)例 print(f'攻擊前:{d2.blood}')
d1.attack(d2)
print(f'攻擊后:{d2.blood}')
  • 首先創(chuàng)建了一個(gè)Dog類,它包含了4個(gè)屬性,和一個(gè)方法。
  • 接下來(lái),我們就像女媧造人一樣,用Dog類作為模板,構(gòu)建出兩個(gè)狗d1和d2。
  • 然后d1攻擊了d2。

這雖然看起來(lái)代碼比上面還長(zhǎng),但是代碼很自然,更容易懂,更有“人性”。

如果我們要?jiǎng)?chuàng)建100個(gè)Dog,也很容易。把這100個(gè)Dog放到一個(gè)列表中也很方便。

下面我們來(lái)庖丁解牛,從零開(kāi)始學(xué)習(xí)面向?qū)ο蟮暮诵母拍睢?

2.構(gòu)造方法和屬性

我們?cè)倩氐角懊娴睦?,從零開(kāi)始,理解類的核心概念。

最簡(jiǎn)單的類

#最簡(jiǎn)單的類 class Dog:   pass 

這是一個(gè)最簡(jiǎn)單的類,它里面什么都沒(méi)有,就像一個(gè)空白的信封。注意類的定義以class開(kāi)頭,后面是類的名字,類名一般用大寫。

創(chuàng)建實(shí)例

雖然它什么都沒(méi)有,但我們?nèi)匀豢梢杂盟鼇?lái)創(chuàng)建實(shí)例。

d1 = Dog()
d2 = Dog() print(id(d1)) print(id(d2))

創(chuàng)建實(shí)例通過(guò)使用類名加括號(hào),有的類需要傳入?yún)?shù)。通過(guò)下面的打印可以看出d1和d2的內(nèi)存地址不同,他們確實(shí)是不同的實(shí)例,在內(nèi)存里有自己獨(dú)立的房間。

Python是一個(gè)動(dòng)態(tài)語(yǔ)言,我們可以給類動(dòng)態(tài)的添加屬性:

d1.name = '旺財(cái)' print(d1.name) print(d2.name)  #報(bào)錯(cuò),因?yàn)閐2沒(méi)有name屬性 

正常情況下類不是空的,我們要求創(chuàng)建實(shí)例的時(shí)候就必須填寫必要的信息,這樣才是一個(gè)有效的實(shí)例。

構(gòu)造方法 init

我們創(chuàng)建實(shí)例的過(guò)程,會(huì)調(diào)用了一個(gè)叫做__init__的方法。前面的Dog中沒(méi)有init方法,它就給我們創(chuàng)建了一個(gè)空的對(duì)象出來(lái)。實(shí)際上Python調(diào)用了Object類的init方法,這個(gè)方法不需要傳任何參數(shù),也不做任何事情。

現(xiàn)在我們給Dog類加上__init__方法:

#類是一個(gè)模板 class Dog:  #構(gòu)造方法  def __init__(self, name, height, blood, power):
  self.name = name
  self.height = height
  self.blood = blood
  self.power = power

這時(shí)候如果再去創(chuàng)建Dog的實(shí)例,而不傳入?yún)?shù)就會(huì)報(bào)錯(cuò)了:

d1 = Dog() #報(bào)錯(cuò),必須要傳入指定的參數(shù) 

init函數(shù)的第一個(gè)參數(shù)永遠(yuǎn)是self,表示當(dāng)前對(duì)象,表示自己。后面的參數(shù)看我們自己的需要,我們希望Dog類有name, height, blood和power等幾個(gè)屬性,所以我們就加了這幾個(gè)參數(shù)。

現(xiàn)在來(lái)正常的創(chuàng)建兩個(gè)實(shí)例:

d1 = Dog('大黃'0.7103#創(chuàng)建第1個(gè)實(shí)例 d2 = Dog('二黑'0.5104#創(chuàng)建第2個(gè)實(shí)例 

創(chuàng)建實(shí)例的時(shí)候,不需要傳入第一個(gè)self參數(shù),Python會(huì)自動(dòng)傳入。我們只要傳入self后面的幾個(gè)參數(shù)就行。注意參數(shù)的順序。

self和屬性

這里需要認(rèn)識(shí)一下self:

  • self表示當(dāng)前的實(shí)例。
  • self只用在類的內(nèi)部,在外部就直接使用變量名了,如d1,d2
  • 通過(guò)self.name='XXX'就給當(dāng)前實(shí)例創(chuàng)建了一個(gè)名為name的屬性。
  • 不同實(shí)例的屬性的值是不同的。

默認(rèn)屬性

并不是所有的屬性都一定要在構(gòu)造方法中傳入,比如我們規(guī)定:blood在創(chuàng)建的時(shí)候默認(rèn)都是10,也就是滿血。

那么就沒(méi)必要在init中傳入這個(gè)參數(shù)了。我們可以在init函數(shù)中設(shè)置默認(rèn)的值為10。

class Dog:  #構(gòu)造方法  def __init__(self, name, height, power):
  self.name = name
  self.height = height
  self.blood = 10   self.power = power

訪問(wèn)和修改屬性

  • 在類的內(nèi)部,通過(guò)self.xxx訪問(wèn)屬性
  • 在類的外部,通過(guò)變量名 d1.xxx訪問(wèn)屬性
  • 修改屬性,用賦值語(yǔ)句賦值即可:
  • 外部:d1.name = '大黃黃'。
  • 內(nèi)部:self.name = '大黃黃'

數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見(jiàn):http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }