python面向?qū)ο?

內(nèi)置類屬性

什么是內(nèi)置類屬性

在聲明的時(shí)候系統(tǒng)自動(dòng)添加的屬性(可能是字段也可能是對(duì)象屬性)

class Person:
    num = 61

    # 注意:如果設(shè)置了__slots__的值,那么當(dāng)前類的對(duì)象就不能使用__dict__屬性
    def __init__(self, name, sex, age):
        self.name = name
        self.sex = sex
        self.age = age

    def eat(self, food):
        print()

    # 定制當(dāng)前類的對(duì)象
    # 1)重寫__str__方法,這個(gè)方法的返回值就是對(duì)應(yīng)的打印結(jié)果(類型必須是字符串)
    # def __str__(self):
    #     return '<' + str(self.__dict__)[1:-1] + '>'

    # 重寫__repr__方法,這個(gè)方法的返回值就是對(duì)應(yīng)的打印結(jié)果(類型必須是字符串
    def __repr__(self):
        return '<' + str(self.__dict__)[1:-1] + '>'

person1 = Person('小米', '男', 18)
# 1.__name__
"""
類的字段:類名.__name__    -   獲取類的名字
"""
print('==============')
print(type(Person.__name__))

# 2.__doc___
"""
類的字段;類.__doc___     -   獲取聲明文檔
"""

# 3.__class__
"""
對(duì)象屬性:對(duì)象.__class__   -   獲取對(duì)象對(duì)應(yīng)的類(和type功能一樣)

"""
print('================')
p1 = person1.__class__('小米', '男', 17)
print(p1.age)
print(type(person1))

# 4.__dict__(將對(duì)象轉(zhuǎn)換成字典)
"""
對(duì)象屬性:對(duì)象.__dict__    -   將對(duì)象中所有的屬性和值轉(zhuǎn)換成對(duì)應(yīng)的一個(gè)字典中的鍵值對(duì)(一個(gè)對(duì)象對(duì)應(yīng)一個(gè)字典)
類的字段:類.__dict__     -   將類轉(zhuǎn)換成一個(gè)字典,字典值的元素是類中所有的字段和對(duì)應(yīng)的值
"""
print(person1.__dict__)
print(Person.__dict__)
person = [person1]
print(person)

# 5.__module__
"""
類的字段:類.__module__   -   獲取聲明當(dāng)前類是在哪個(gè)模塊中聲明的(返回的是模塊的名字)
"""

# 6.__bases__
"""
類的字段:類.__bases__    -   獲取當(dāng)前類的父類(返回的是一個(gè)元組)
"""

私有化

  • 1.訪問權(quán)限:公有、保護(hù)、私有
    ????公有 - 公有的屬性和方法在類的內(nèi)部、外部能夠使用,也能被繼承
    ????保護(hù) - 保護(hù)的屬性和方法只能在類的內(nèi)部使用,可以被繼承
    ????私有 - 私有的屬性和方法只能在類的內(nèi)部使用,不能被繼承
  • 2.python中的屬性和方法的訪問權(quán)限
    ????python類中所有的屬性和方法本質(zhì)都是公開的;私有化是假的,只是提示程序員這個(gè)屬性和方法在外部不要使用,也不要去繼承
    ????怎么私有化:在需要私有化的屬性名和方法前加'__'(注意不能以'__'結(jié)尾)
    python私有化的原理:在私有的屬性和方法前加了'_類名'

屬性的getter和setter

  • 1.什么是getter和setter
    ??當(dāng)我們需要在獲取屬性值之前做點(diǎn)別的事情,就需要給這個(gè)屬性添加getter
    ??當(dāng)我們需要給屬性賦值之前做點(diǎn)別的事情,就需要給這個(gè)屬性添加getter
  • 2.給屬性添加getter
    ??1)屬性命名的時(shí)候前面加'_'
    ??2)在@property裝飾器后面聲明一個(gè)對(duì)象方法
    ????a.將屬性去掉下劃線作為方法名
    ????b.方法除了self以外不需要其他參數(shù)
    ????c.函數(shù)的返回值就是獲取這個(gè)屬性的時(shí)候得到的值
    ??3)在外部使用屬性的時(shí)候,通過'對(duì)象.不帶下劃線'去使用
    ??注意:獲取屬性值的時(shí)候,就會(huì)自動(dòng)去調(diào)用getter函數(shù)

3.給屬性添加setter
??屬性添加setter之前必須先添加getter
??1)保證屬性名前'_'
??2)在@getter名.setter后面聲明對(duì)象方法
????a.將屬性去掉下劃線作為方法名
????b.需要一個(gè)self以外的參數(shù)
????c.不需要返回值
??3)在外部使用屬性的時(shí)候,通過'對(duì)象.不帶下劃線'去使用
??注意:當(dāng)給屬性賦值的時(shí)候,實(shí)質(zhì)是調(diào)用setter對(duì)應(yīng)的方法

# 練習(xí):寫一個(gè)矩形類,有長(zhǎng),寬,面積,周長(zhǎng)
class Rectangle:
    def __init__(self, length, weight):
        self._length = length
        self._weight = weight
        self._area = None
        self._perimeter = None

    @property
    def length(self):
        return self._length

    @length.setter
    def length(self, value):
        if (isinstance(value, int) or isinstance(value, float)) and value > 0:
            self._length = value
        else:
            raise ValueError

    @property
    def weight(self):
        return self._weight

    @weight.setter
    def weight(self, value):
        if (isinstance(value, int) or isinstance(value, float)) and value > 0:
            self._weight = value
        else:
            raise ValueError

    @property
    def area(self):
        self._area = self._weight * self._length
        return self._area

    @area.setter
    def area(self, value):
        raise ValueError

    @property
    def perimeter(self):
        self._perimeter = (self._weight + self._length) * 2
        return self._perimeter

    @perimeter.setter
    def perimeter(self, value):
        raise ValueError

r1 = Rectangle(100, 200)
print(r1.area)
print(r1.perimeter)
r1.length = 20
r1.weight = 30
print(r1.area)
print(r1.perimeter)

方法

  • 1.對(duì)象方法
    ??1)怎么聲明:直接聲明
    ??2)怎么調(diào)用:用對(duì)象來調(diào)用
    ??3)特點(diǎn):有指向當(dāng)前對(duì)象的self
    ??4)什么時(shí)候用:如果實(shí)現(xiàn)函數(shù)的功能需要用到對(duì)象屬性,就是用對(duì)象方法

  • 2.類方法
    ??1)怎么聲明:聲明在@classmethod
    ??2)怎么調(diào)用:用類來調(diào)用
    ??3)特點(diǎn):有自帶的參數(shù)cls,表示當(dāng)前類;這個(gè)參數(shù)在調(diào)用的時(shí)候不傳參,系統(tǒng)會(huì)將當(dāng)前類傳給它
    ??????cls:誰(shuí)調(diào)用就指向誰(shuí)(如果是對(duì)象,指向的是對(duì)象對(duì)應(yīng)的類)
    ??4)什么時(shí)候用:如果實(shí)現(xiàn)函數(shù)的功能不需要對(duì)象屬性,但需要類的字段,就是用類方法

  • 3.靜態(tài)方法
    ??1)怎么聲明:聲明在staticmethod后面
    ??2)怎么調(diào)用:通過類來調(diào)用,'類.靜態(tài)方法()'
    ??3)特點(diǎn):沒有默認(rèn)參數(shù)
    ??4)什么時(shí)候用:實(shí)現(xiàn)函數(shù)的功能既不需要類也不需要對(duì)象,就是使用靜態(tài)方法

繼承

  • 1.什么是繼承
    ??繼承就是讓子類直接擁有父類的屬性和方法
    ??子類 - 繼承者
    ??父類/超類 - 被繼承者
  • 2.怎么繼承
    1)語(yǔ)法
    ??class 類名(父類1,父類2....):
    ????說明文檔
    ????類的內(nèi)容
    2)說明
    ??() - 固定寫法,如果省略相當(dāng)于(object)聲明類的時(shí)候如果沒有寫父類,默認(rèn)繼承object(object又叫基類)
    ??父類 - 一個(gè)類的父類可以有多個(gè),但是一般情況下只有一個(gè)(支持多繼承)
    ??注意:在子類中可以加super()去調(diào)用父類的方法(只能在對(duì)象方法和類方法中使用)在子類中添加對(duì)象屬性,需要通過super()去調(diào)用父類的init方法
最后編輯于
?著作權(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)置類屬性 內(nèi)置類屬性:python中每個(gè)類都擁有內(nèi)置的類屬性_name__doc__dict__module__...
    慢節(jié)拍_2709閱讀 337評(píng)論 0 4
  • 面向?qū)ο缶幊? 1 內(nèi)置的類屬性 內(nèi)置類屬性:python中每個(gè)類都擁有內(nèi)置的類屬性 舉例說明: 2屬性私有化 p...
    Fizz翊閱讀 241評(píng)論 0 2
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,666評(píng)論 1 32
  • 少時(shí)輕狂還妄稱雄 京都繁華欲問天公 直言不畏暗流洶涌 終赤袍加身獲爵功 ——多年未歸故鄉(xiāng)任舊 物是人非卻一場(chǎng)空 遲...
    離陌_6639閱讀 3,270評(píng)論 13 77
  • 一剪梅.思念 兜兜轉(zhuǎn)轉(zhuǎn)一灣碧,寂靜無(wú)波,清泠冷冽。 蒼蒼莽莽衰草黃,一眼無(wú)邊,漫接天際。 迷迷蒙蒙薄霧稀,白樺無(wú)聲...
    胡詩(shī)宏閱讀 280評(píng)論 0 1

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