溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么在Python中利用class()實(shí)現(xiàn)面向?qū)ο?/h1>
發(fā)布時(shí)間:2021-04-16 16:31:35 來(lái)源:億速云 閱讀:122 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

怎么在Python中利用class()實(shí)現(xiàn)面向?qū)ο??很多新手?duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

首先,類是一個(gè)集合,包含了數(shù)據(jù),操作描述的一個(gè)抽象集合

你可以首先只把類當(dāng)做一個(gè)容器來(lái)使用

class Cycle:
  def __init__(self,r):
    self.pi=3.14
    self.r=r
a=Cycle(4)
b=Cycle(7)
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)

看起來(lái)沒(méi)有問(wèn)題,好了,現(xiàn)在問(wèn)題來(lái)了,假如,你現(xiàn)在要計(jì)算很多圓的面積,那么你是不是發(fā)現(xiàn),不斷的用變量命來(lái)隔離數(shù)據(jù)方式變得越來(lái)越臟了。而且你發(fā)現(xiàn)是不是有很多冗余的代碼

好了我們這么改一改

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)

好了,你有沒(méi)有覺(jué)得現(xiàn)在清晰了一點(diǎn)。

好了,現(xiàn)在我們現(xiàn)在還可以改一下

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

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

好了,我現(xiàn)在要計(jì)算長(zhǎng)方形,原型,梯形各種各樣二維幾何圖形的面積,這樣該怎么寫(xiě)???

你想了想我們之前說(shuō)的將類作為數(shù)據(jù)容器,你想了想寫(xiě)了如下的代碼

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)

你想一想,這樣是不是感覺(jué)如果計(jì)算需求越來(lái)越多,代碼是不是還是會(huì)越來(lái)越臟?

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

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()

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

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

好了再舉一個(gè)例子,我們可以用類來(lái)控制訪問(wèn)權(quán)限

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

你看,我們用 private 變量,來(lái)確保外部沒(méi)法直接訪問(wèn)一些敏感數(shù)據(jù)(實(shí)際上 Python 里 private 并不嚴(yán)格,hook 一下還是可以訪問(wèn)的)

好,在舉一個(gè)例子

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)養(yǎng)不足")
    self.__favorite_website=value

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI