最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python基于class()實現面向對象原理詳解

 更新時間:2020年03月26日 12:02:47   作者:Python熱愛者  
這篇文章主要介紹了Python基于class()實現面向對象原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

首先,類是一個集合,包含了數據,操作描述的一個抽象集合

你可以首先只把類當做一個容器來使用

class Cycle:
  def __init__(self,r):
    self.pi=3.14
    self.r=r
a=Cycle(4)
b=Cycle(7)

你看,我們定義了一個 Cycle 類,我們現在只是將它當做一個數據集合來用,我們利用其實例之間彼此數據隔離的特性來保證具體的實例數據彼此不污染。好了你現在想問,為什么我們要用數據集合來放數據

好了,我們來看看沒有類之前我們會怎么樣,假設我們現在要計算圓的面積

def square(r,pi):
  return pi * (r**2)
PI=3.14
a_r=4
a_square=square(a_r,PI)
b_r=7
b_square=square(b_r,PI)

看起來沒有問題,好了,現在問題來了,假如,你現在要計算很多圓的面積,那么你是不是發(fā)現,不斷的用變量命來隔離數據方式變得越來越臟了。而且你發(fā)現是不是有很多冗余的代碼

好了我們這么改一改

class Cycle:
  def __init__(self,r):
    self.pi=3.14
    self.r=r

def square(value):
  if not isinstance(value,Cycle):
    raise ValueError("value muse be Cycle instace")
  value.square=value.pi * (value.r**2)

a=Cycle(4)
b=Cycle(7)

square(a)
square(b)

好了,你有沒有覺得現在清晰了一點。

好了,現在我們現在還可以改一下

class Cycle:
  def __init__(self,r):
    self.pi=3.14
    self.r=r
  def square(self,value):
    return self.pi * (self.r**2)

好了,現在你可能迷惑了,我們?yōu)樯兑?square 函數放在類中?

好了,我現在要計算長方形,原型,梯形各種各樣二維幾何圖形的面積,這樣該怎么寫???

你想了想我們之前說的將類作為數據容器,你想了想寫了如下的代碼

class Rectangle:
  def __init__(self,length,height):
    self.length=length
    self.height=height
class Cycle:
  def __init__(self,r):
    self.pi=3.14
    self.r=r
def rec_square(value):
  if not isinstance(value,Rectangle):
    raise ValueError("value muse be Rectangle instace")
  value.square=value.length * value.height
def cycle_square(value):
  if not isinstance(value,Cycle):
    raise ValueError("value muse be Cycle instace")
  value.square=value.pi * (value.r**2)

你想一想,這樣是不是感覺如果計算需求越來越多,代碼是不是還是會越來越臟?

如果我們將函數放在類里,并且用繼承的特性,我們可以寫出這樣的代碼

class Geometry:
  def get_square(self):
    raise NotImplementedError

class Rectangle(Geometry):
  def __init__(self,length,height):
    self.length=length
    self.height=height
  def get_square(self):
    return self.length*self.height

class Cycle(Geometry):
  def __init__(self,r):
    self.pi=3.14
    self.r=r
  def get_square(self):
    return self.pi * (self.r**2)

def square(value):
  if not isinstance(value,Geometry):
    raise ValueError("value muse be Geometry instace")
  value.square=value.get_square()

你看,我們現在只需要給用戶暴露一個統(tǒng)一的接口,用戶(用戶也以是我們自己)不需要關心怎么樣選擇正確的函數,他只需要調用統(tǒng)一的 square 函數,就可以獲取到具體的面積,是不是輕松很多了??

所以,類,它是對數據,操作的一種封裝,這個封裝的意義在于我們可以去更好的優(yōu)化代碼結構。

好了再舉一個例子,我們可以用類來控制訪問權限

class People:
  def __init__(self,website):
    self.__favorite_website="1024.com"
  def bad_or_not(self):
    return self.__favorite_website=="1024.com"

你看,我們用 private 變量,來確保外部沒法直接訪問一些敏感數據(實際上 Python 里 private 并不嚴格,hook 一下還是可以訪問的)

好,在舉一個例子

class People:
  def __init__(self,website):
    self.__favorite_website="1024.com"
  def bad_or_not(self):
    return self.__favorite_website=="1024.com"
  @property
  def favorite_website(self):
    return self.__favorite_website
  @favorite_website.setter
  def favorite_website(self,value):
    if value=="1024.com":
      raise ValueError("你不能去草榴,兄弟,你營養(yǎng)不足")
    self.__favorite_website=value

你看,我們現在很方便的實現在設置數據值的時候,對其過濾。

撤了這么多,回到你的問題

首先A君說的沒毛病,但我想知道僅僅使用函數錘子,螺絲刀來完成一個項目比使用Class工廠+函數錘子來完成一個項目的效率會更低么?

理由是什么?大神在什么時候會考慮使用Class來提高代碼的“執(zhí)行效率”和代碼的“可讀性”?;貧w實際情況,我很多時候都是調用同一個函數/方法去輸出某個結果。

至今還想不出為什么調用Class會更方便?(PS:本人大菜鳥,寫了上千行代碼了,但仍然搞不懂什么情況下需要用到Class類。也曾嘗試在自己的代碼中強行加入Class輸出結果

但感覺不靈活,而且要寫的代碼明顯多了也不便于理解。求大神舉例,碾壓我的無知?。?。C君說大型項目不使用Class調用對象會累死,到底這個“累死”體現在哪里?

首先一個問題,我整個答案里所寫的這些代碼,不用面向對象這一套能不能實現?

很明顯,能。

但是實現的干凈么?個人覺得不干凈。

項目規(guī)格上去后,我們如果按照傳統(tǒng)的方式進行開發(fā),務必要多重檢查,確保自己不會手抖調用了錯誤的東西。而 OOP 這一套思想,其實就是通過利用合適的代碼結構和封裝,某種程度上來講是減少我們犯錯的可能。

同時,現在開發(fā)基本都不是一個人的單打獨斗,你寫的代碼可能會被其余人使用與維護。我們有個前提,要假設使用維護你代碼的人都是傻逼。我們要適當的封裝代碼,優(yōu)化結構,讓使用者盡可能的少犯錯、

所以最后,無論是各個語言的變量命名規(guī)則也好,還是 OOP 這一套范式也好。其本質是在自由度與可讀性可維護性之間的一種相對較優(yōu)的妥協(xié),這種妥協(xié)根本的目的就在于通過規(guī)范化的操作與封裝,減少團隊開發(fā)維護的成本,優(yōu)化開發(fā)體驗。

另外,關于開發(fā)這一套還有個老生常談的問題過度封裝。我個人的觀點是在你知道什么是 過度封裝 之前,你沒必要考慮這個問題,按照教科書和開源代碼里的結構,去不斷封裝優(yōu)化你的代碼。

面向對象 更容易使用 ,缺點就是 換一個開發(fā)人,難維護,很難理解前面人的思維,出了錯不好找位置

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Python對Excel兩列數據進行運算的示例代碼

    Python對Excel兩列數據進行運算的示例代碼

    本文介紹了如何使用Python中的pandas庫對Excel表格中的兩列數據進行運算,并提供了詳細的代碼示例,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • Python?中的反轉字符串reversed(),切片

    Python?中的反轉字符串reversed(),切片

    這篇文章主要介紹了Python?中的反轉字符串reversed(),切片?,以相反的順序反轉和處理字符串可能是編程中的一項常見任務。Python?提供了一組工具和技術,可以幫助我們快速有效地執(zhí)行字符串反轉,下面來看看具體內容吧
    2021-12-12
  • Python cookbook(數據結構與算法)讓字典保持有序的方法

    Python cookbook(數據結構與算法)讓字典保持有序的方法

    這篇文章主要介紹了Python讓字典保持有序的方法,涉及Python基于collections模塊中的OrderedDict類實現控制字典順序的相關操作技巧,需要的朋友可以參考下
    2018-02-02
  • 用python畫一只可愛的皮卡丘實例

    用python畫一只可愛的皮卡丘實例

    今天小編就為大家分享一篇用python畫一只可愛的皮卡丘實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • python中split方法用法分析

    python中split方法用法分析

    這篇文章主要介紹了python中split方法用法,實例分析了split方法的功能及相關使用技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • python基于paramiko將文件上傳到服務器代碼實現

    python基于paramiko將文件上傳到服務器代碼實現

    這篇文章主要介紹了python基于paramiko將文件上傳到服務器代碼實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • Python中如何避免默認參數的陷阱

    Python中如何避免默認參數的陷阱

    在 Python 中,我們經常會使用函數的默認參數來簡化代碼,但你知道嗎默認參數的行為有時可能會導致一些難以察覺的錯誤,下面小編就為大家介紹一下如何避免這樣的錯誤吧
    2025-01-01
  • Python中實現三目運算的方法

    Python中實現三目運算的方法

    這篇文章主要介紹了Python中實現三目運算的方法,本文用and/or 運算符模擬實現三目運算,需要的朋友可以參考下
    2015-06-06
  • python 生成空字符串的5種方法

    python 生成空字符串的5種方法

    有時候我們需要生成一個空的字符串,本文就來介紹一下python 生成空字符串的5種方法,包括使用空的單引號或雙引號、使用str函數、字符串連接、字符串格式化以及字符串乘法,感興趣的可以了解一下
    2024-01-01
  • NumPy數組復制與視圖詳解

    NumPy數組復制與視圖詳解

    NumPy 數組的復制和視圖是兩種不同的方式來創(chuàng)建新數組,它們之間存在著重要的區(qū)別,本文將給大家詳細介紹一下NumPy數組復制與視圖,并通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2024-05-05

最新評論

驻马店市| 五指山市| 苗栗县| 水城县| 邯郸市| 班戈县| 奇台县| 卓资县| 临潭县| 迁安市| 永川市| 班戈县| 通山县| 邹平县| 洮南市| 朝阳市| 南丹县| 旺苍县| 佛坪县| 南昌市| 双江| 来凤县| 宁化县| 汾西县| 佛坪县| 肇东市| 浦县| 托克托县| 琼海市| 绥化市| 中卫市| 建德市| 偃师市| 湘潭县| 玉田县| 会宁县| 右玉县| 南郑县| 赤壁市| 平昌县| 杭州市|