Python最全面向?qū)ο箝_發(fā)-類的基礎(chǔ)

對(duì)于我們來講并不陌生,很多語言都有類,比如OC、JS、Java等,所有Python也自然有類的概念。

一、Python中類的定義

Python中有兩種類(新式類與經(jīng)典類),兩種類的比較,此文主要討論新式類

Python類 版本 特點(diǎn) 多繼承特點(diǎn) 方法對(duì)比
經(jīng)典類 Python2.x 隱式不繼承object,顯示繼承object 是新式類 采用廣度優(yōu)先搜索 -
新式類 Python3.x 隱式繼承object 深度優(yōu)先搜索 新增 ___slots____ ____getattribute____ 內(nèi)置屬性

相同點(diǎn):\color{red}{類名首字母需要大寫}

1.1 限制類的屬性 ____slots____ 是一個(gè)屬性限制列表

 class Person:
        __slots__ = ['age', 'height']
  p = Person()
  p.age = 10
  p.height = 4

二、Python中類的屬性

聲明:Python里面并沒有真正的私有化,但是可以使用下劃線(_)來完成偽私有化
x 公有屬性
_x(單下劃線) 受保護(hù)屬性
__x(雙下劃線) 私有屬性
xx
(下劃線) 與系統(tǒng)的關(guān)鍵字區(qū)別
____xx____ 系統(tǒng)內(nèi)置的寫法

2.1受保護(hù)屬性的訪問限制

類的內(nèi)部 子類的內(nèi)部 可以訪問 模塊內(nèi) 跨模塊 有警告 跨模塊可以使用all字段申明可以跨模塊使用的屬性

2.2 私有屬性的訪問限制

只有在當(dāng)前類被訪問 ,不能被子類 模塊內(nèi)訪問 跨模塊訪問的規(guī)則和受保護(hù)屬性規(guī)則一致

2.3 @property 裝飾器 可以使用屬性的方式訪問屬性

class Person(object):
    def __init__(self):
        self.__age = 24
        self.__weight = 140

    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self, value):
        self.__age = value

    @age.deleter
    def age(self):
        del self.__age

    @property
    def weight(self):
        return self.__weight
    p = Person()
    p.age = 20
    print(p.age)
    print(p.weight)
    print(p.__dict__)

2.4 常用的系統(tǒng)內(nèi)置屬性

__dict__ 查看屬性
__bases__ 查看所有父類的元類
__doc__ 查看類的描述
__name__ 查看類的名稱
__module__ 查看類定義所在的模塊

三、Python中類的方法

Python類中的方法有三種

  • A、類方法 (第一個(gè)參數(shù)是類)
  • B、實(shí)例方法(第一個(gè)參數(shù)是實(shí)例)
  • C、靜態(tài)方法(沒有參數(shù))

類中的方法說明

class Person:
      # 這是一個(gè)實(shí)例方法,第一個(gè)參數(shù)必須接收一個(gè)實(shí)例 ,只有實(shí)例調(diào)用
      def test(self):
            print('這是一個(gè)實(shí)例方法,第一個(gè)參數(shù)必須接收一個(gè)實(shí)例', self)

      # 這是一個(gè)類方法,第一個(gè)參數(shù)必須接收一個(gè)類 實(shí)例和類都可以調(diào)用
      @classmethod
      def leifangfa(cls):
            print('這是一個(gè)類方法,第一個(gè)參數(shù)必須接收一個(gè)類', cls)

        # 這是一個(gè)靜態(tài)方法,沒有參數(shù)  實(shí)例和類都可以調(diào)用
      @staticmethod
      def jintafanfa():
              print('這是一個(gè)靜態(tài)方法,沒有參數(shù)')

注意:不同方法里面訪問不同屬性的權(quán)限問題 方法里面能拿到實(shí)例就只能訪問實(shí)例屬性 方法里面能拿到類,就能拿到類屬性

3.1 私有化方法 與 私有化屬性一樣 都是加_(下劃線)

class Person(object):
    # 私有屬性
    __age = 10

    # 私有方法 _Person__run()
    def __run(self):
        print('xxxxxxx')

    # 覆蓋了__run方法  不能這么定義
    def _Person__run(self):
        print('ddd')

3.2 類常用的的內(nèi)置方法
A. 信息格式化操作

# 打印對(duì)象的內(nèi)容 - 描述對(duì)象
def __str__(self):
   return '這個(gè)人的姓名是:%s, 這是人的年齡是:%s'%(self.name, self.age)

# 取實(shí)例對(duì)象的本質(zhì)信息:面向開發(fā)者人員
def __repr__(self):
      return '獲取實(shí)例對(duì)象的本質(zhì)信息'

#調(diào)用操作__call__ 使一個(gè)對(duì)象具有函數(shù) 被調(diào)用的能力 可以通過p()調(diào)用
def __call__(self, *args, **kwargs):
    print('xxxxx', args, kwargs)

B.索引操作:把對(duì)象當(dāng)做字典來操作

class Person(object):

  def __init__(self):
      self.cache = {}

  def __setitem__(self, key, value):
      print('__setitem__ ---key:%s --value : %s'%(key, value))
      self.cache[key] = value

  def __getitem__(self, item):
       print('__getitem__ ---item:%s '%item)
      return self.cache[key]

  def __delitem__(self, key):
      print('__delitem__ ---key:', key)
      del self.cache[key]
p = Person()
p['name'] = 'zb'
print(p.__dict__)
print(p.cache['name'])

C.類的裝飾器

class checkName(object):

  def __init__(self, func):
      self.func = func

  def __call__(self, *args, **kwargs):
      print('類的裝飾器的檢測(cè)')
      self.func()

@checkName
def fashuoshuo():
     print('發(fā)說說。。。。。')

// 調(diào)用
 fashuoshuo()

最后贈(zèng)言

學(xué)無止境,學(xué)習(xí)Python的伙伴可以多多交流。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容