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

熱線電話:13121318867

登錄
首頁大數(shù)據(jù)時代不會面向?qū)ο?,肯定學不好!簡易的Python面向?qū)ο蠊ヂ詠砝?/a>
不會面向?qū)ο螅隙▽W不好!簡易的Python面向?qū)ο蠊ヂ詠砝?/h5>
2021-01-22
收藏

來源:麥叔編程

作者:麥叔

1. 第一個類

面向?qū)ο蟮母拍?

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

不會面向?qū)ο?,肯定學不好!簡易的Python面向?qū)ο蠊ヂ詠砝? class=

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

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

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

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

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

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

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

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

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

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

面向過程的代碼可能是這樣的

#表示狗的屬性 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條狗互相亂咬呢?

我們來看看面向?qū)ο蟮膶懛ǎ?

面向?qū)ο蟮拇a

#類是一個模板 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個實例 d2 = Dog('二黑'0.5104#創(chuàng)建第2個實例 print(f'攻擊前:{d2.blood}')
d1.attack(d2)
print(f'攻擊后:{d2.blood}')
  • 首先創(chuàng)建了一個Dog類,它包含了4個屬性,和一個方法。
  • 接下來,我們就像女媧造人一樣,用Dog類作為模板,構(gòu)建出兩個狗d1和d2。
  • 然后d1攻擊了d2。

這雖然看起來代碼比上面還長,但是代碼很自然,更容易懂,更有“人性”。

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

下面我們來庖丁解牛,從零開始學習面向?qū)ο蟮暮诵母拍睢?

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

我們再回到前面的例子,從零開始,理解類的核心概念。

最簡單的類

#最簡單的類 class Dog:   pass 

這是一個最簡單的類,它里面什么都沒有,就像一個空白的信封。注意類的定義以class開頭,后面是類的名字,類名一般用大寫。

創(chuàng)建實例

雖然它什么都沒有,但我們?nèi)匀豢梢杂盟鼇韯?chuàng)建實例。

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

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

Python是一個動態(tài)語言,我們可以給類動態(tài)的添加屬性:

d1.name = '旺財' print(d1.name) print(d2.name)  #報錯,因為d2沒有name屬性 

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

構(gòu)造方法 init

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

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

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

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

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

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

現(xiàn)在來正常的創(chuàng)建兩個實例:

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

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

self和屬性

這里需要認識一下self:

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

默認屬性

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

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

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

訪問和修改屬性

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

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

若不方便掃碼,搜微信號: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(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".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 = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+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); }