欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python3.0中普通方法、類方法和靜態(tài)方法的比較

 更新時間:2019年05月03日 13:55:21   作者:lajos182  
本文主要講解了Python3中普通方法、類方法和靜態(tài)方法的區(qū)別與比較,費(fèi)了作者可大的勁整理了,希望對大家有用

一、語法區(qū)別

剛接觸Python中的面向?qū)ο螅瑢τ陬惙椒ê挽o態(tài)方法難以區(qū)分,通過查找知乎、CSDN論壇,廢了好大的勁思路才逐漸明朗,所以就總結(jié)順便分享一下。

首先開始編輯代碼

# 普通方法、類方法、靜態(tài)方法的比較
# 普通方法、類方法、靜態(tài)方法的比較
class Test:
  # 定義類Test的屬性
  name = 'python'
  content = '人生苦短,我用python!'
  def normal_method(self): # 普通方法訪問類Text的屬性
    print(self.content)
  @classmethod #類方法訪問Test類的屬性,看到@staticmethod我們就知道這個方法并不需要依賴對象本身的狀態(tài)
  def class_method(cls):
    print(cls.content)
  @staticmethod #靜態(tài)方法,無法訪問Test類的屬性,
  def static_method():
    print('content')

進(jìn)行測試一

t = Test()
t.content = '人生苦短,及時行樂'#設(shè)置對象t的屬性
 
t.normal_method()
t.class_method()
t.static_method()
 
# 結(jié)果
人生苦短,及時行樂
人生苦短,我用python!
content

使用普通方法、類方法和靜態(tài)方法都可以通過對象(t)進(jìn)行調(diào)用,但是靜態(tài)方法和類方法無法訪問對象的屬性,所以更改對象(t)的屬性僅僅只是對普通方法起作用。

進(jìn)行測試二

# Test.content('name')出現(xiàn)錯誤,普通方法無法通過類調(diào)用
Test.class_method()
Test.static_method()
# 結(jié)果
人生苦短,我用python!
content

普通方法無法通過類名調(diào)用,但靜態(tài)方法和類方法是可以的。

總結(jié)

三種方法都可以通過對象進(jìn)行調(diào)用,但類方法和靜態(tài)方法無法訪問對象屬性,類方法通過對象調(diào)用獲取的仍是類屬性(并非對象屬性);普通方法無法通過類名調(diào)用,類方法和靜態(tài)方法可以,但靜態(tài)方法不能進(jìn)行訪問,僅僅只是通過傳值得方式(與函數(shù)調(diào)用相同)

二、簡單應(yīng)用

通過上面的示例僅僅只是知道三種方法的語法區(qū)別,下面繼續(xù)看看三種方法的具體應(yīng)用區(qū)別
示例:用類來實(shí)現(xiàn)部分計(jì)算器功能,并計(jì)算任意兩個整數(shù)的平方和

1. 普通方法

class Test:
  def __init__(self, num1, num2):
    self.num1 = num1
    self.num2 = num2
  def plus(self):
    result = self.num1 + self.num2
    return result
  def multiply(self):
    result = self.num1 * self.num2
    return result
t1 = Test(3, 3)
m = t1.multiply()
t2 = Test(4, 4)
n = t2.multiply()
t3 =Test(m, n)
sum = t3.plus()
print(sum)

2. 類方法(@classnethod)

class Test:
  def __init__(self, num1, num2):
    self.num1 = num1
    self.num2 = num2
  def plus(self):
    result = self.num1 + self.num2
    return result
  def multiply(self):
    result = self.num1 * self.num2
    return result
  @classmethod
  def sum(cls, num1, num2):
    t1 = Test(3, 3)
    m = t1.multiply()
    t2 = Test(4, 4)
    n = t2.multiply()
    t3 = Test(m, n)
    print(t3.plus())
Test.sum(3, 4)

3.靜態(tài)方法(@staticmethod)

class Test:
  def __init__(self, num1, num2):
    self.num1 = num1
    self.num2 = num2
  def plus(self):
    result = self.num1 + self.num2
    return result
  def multiply(self):
    result = self.num1 * self.num2
    return result
  @staticmethod
  def sum(num1, num2):
    s = num1 * num1 + num2 * num2
    print(s)
Test.sum(3, 4)

4.總結(jié) 

以上三種方法都能實(shí)現(xiàn)示例要求的功能。使用類方法時,求和功能的那部分代碼并沒有放在類(Test)中,而是作為類的一個成員方法,這樣的好處是可以簡化對象,增加可讀性(直接通過參數(shù)num1、num2來實(shí)現(xiàn)最終功能),但整個過程仍須類(self)參與;使用靜態(tài)方法時,僅僅需要通過傳遞兩個參數(shù)即可實(shí)現(xiàn),單最終結(jié)果仍可作為類方法進(jìn)行訪問。

5.延伸

@classmethod裝飾(類方法): 它的作用就是有點(diǎn)像靜態(tài)類,比靜態(tài)類不一樣的就是它可以傳進(jìn)來一個當(dāng)前類作為第一個參數(shù)。
@staticmethod裝飾(靜態(tài)方法):經(jīng)常有一些跟類有關(guān)系的功能但在運(yùn)行時又不需要實(shí)例和類參與的情況下需要用到靜態(tài)方法。 比如更改環(huán)境變量或者修改其他類的屬性等能用到靜態(tài)方法。這種情況可以直接用函數(shù)解決,但這樣同樣會擴(kuò)散類內(nèi)部的代碼,造成維護(hù)困難。至于靜態(tài)方法就是寫在類里的方法,必須用類來調(diào)用(極少數(shù)情況下使用,一般都在全局里直接寫函數(shù)了)。

相關(guān)文章

  • Python實(shí)現(xiàn)Excel自動分組合并單元格

    Python實(shí)現(xiàn)Excel自動分組合并單元格

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)Excel自動分組合并單元格,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • 如何升級python包到指定版本

    如何升級python包到指定版本

    這篇文章主要介紹了如何升級python包到指定版本問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • flask框架藍(lán)圖和子域名配置詳解

    flask框架藍(lán)圖和子域名配置詳解

    這篇文章主要介紹了flask框架藍(lán)圖和子域名配置,結(jié)合實(shí)例形式詳細(xì)分析了flask框架藍(lán)圖和子域名配置相關(guān)原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2020-01-01
  • Jupyter notebook 遠(yuǎn)程配置及SSL加密教程

    Jupyter notebook 遠(yuǎn)程配置及SSL加密教程

    這篇文章主要介紹了Jupyter notebook 遠(yuǎn)程配置及SSL加密教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Django 路由控制的實(shí)現(xiàn)代碼

    Django 路由控制的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Django 路由控制的實(shí)現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • python使用Flask框架獲取用戶IP地址的方法

    python使用Flask框架獲取用戶IP地址的方法

    這篇文章主要介紹了python使用Flask框架獲取用戶IP地址的方法,實(shí)例分析了Python使用Flask框架remote_addr獲取IP的技巧,非常具有實(shí)用價值,需要的朋友可以參考下
    2015-03-03
  • 手把手教你配置JupyterLab 環(huán)境的實(shí)現(xiàn)

    手把手教你配置JupyterLab 環(huán)境的實(shí)現(xiàn)

    這篇文章主要介紹了手把手教你配置JupyterLab 環(huán)境,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Python利用matplotlib模塊數(shù)據(jù)可視化繪制3D圖

    Python利用matplotlib模塊數(shù)據(jù)可視化繪制3D圖

    matplotlib是python最著名的繪圖庫,它提供了一整套和matlab相似的命令A(yù)PI,十分適合交互式地行制圖,下面這篇文章主要給大家介紹了關(guān)于Python利用matplotlib模塊數(shù)據(jù)可視化實(shí)現(xiàn)3D圖的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • 基于python不同開根號的速度對比分析

    基于python不同開根號的速度對比分析

    這篇文章主要介紹了基于python不同開根號的速度對比分析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python機(jī)器學(xué)習(xí)應(yīng)用之基于LightGBM的分類預(yù)測篇解讀

    Python機(jī)器學(xué)習(xí)應(yīng)用之基于LightGBM的分類預(yù)測篇解讀

    這篇文章我們繼續(xù)學(xué)習(xí)一下GBDT模型的另一個進(jìn)化版本:LightGBM,LigthGBM是boosting集合模型中的新進(jìn)成員,由微軟提供,它和XGBoost一樣是對GBDT的高效實(shí)現(xiàn),原理上它和GBDT及XGBoost類似,都采用損失函數(shù)的負(fù)梯度作為當(dāng)前決策樹的殘差近似值,去擬合新的決策樹
    2022-01-01

最新評論