python攻城獅004--面向對象

python攻城獅004–面向對象

之前三篇
001-函數技巧\變量\包\標準庫
002-高階函數技巧-lambda\filter\map\reduce 函數
003–文件の讀寫


面向對象編程思想:

  • 面向對象編程概述
  • 面向對象編程實現
  • 面向對象編程應用
  • 內存管理
  • 進程\線程\協程 概念及學習

概述

自然界

  • 自然界 ---- ‘萬物皆對象’
  • 面向對象:與對象面對面,關注它

編程界

  • 是模子,確定對象會擁有它的屬性 & 方法(抽象的)
  • 對象的實例(看得見摸得到)
  • 類是對象的類型
  • 對象是特定類型的數據

屬性和方法

  • 屬性 :對象具有的各種靜態特徵
  • 方法 :對象具有的各種動態行爲

面向對象優點


面向對象的三大特徵

封裝

將類的某些信息進行隱藏在內部,不允許外部程序直接訪問.
特點是:只能通過規定方法訪問數據;隱藏類的實例和細節,方便修改和實現.

  • 通過該類提供的方法來實現對隱藏信息的操作和訪問
  • 隱藏對象的信息
  • 流出訪問的接口

舉例 : ATM 取錢 ; 接口:插卡\輸密碼\操作屏

繼承

什麼是繼承 : 就是繼承的屬性 ,又分爲 公有和私有屬性
以動物舉例:

  • 私有: 名字\年齡\性別
  • 公有: 喫\睡\跑 等

基 類 :父類
派生類 : 子類

多態

意味着:允許不同類的對象,對同一消息有不一樣的響應

  • 滿足繼承關係
  • 需要方法的重寫

類高級特性 : @property \ slots: \ 靜態方法 \ 類的方法

  1. @property: 將類的方法當做屬性來用
    代碼表示如下:

class PetCat(object):
    """ 家貓類 """

    def __init__(self, name, age):
        """
        構造方法
        :param name: 貓喫的名稱
        :param age: 貓的年齡
        """
        self.name = name
        # 私有屬性,不能給你們操作
        self.__age = age

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

    @age.setter
    def age(self, value):
        if not isinstance(value, int): # 判斷是不是int
            print('年齡只能是整數')
            return 0
        if value < 0 or value > 100:
            print('年齡只能介於0-100之間')
            return 0
        self.__age = value

    # 描述符
    @property
    def show_info(self):
        """ 顯示貓的信息 """
        return '我叫:{0},今年{1}歲'.format(self.name, self.age)

    def __str__(self):
        return '我的對象: {0}'.format(self.name)


if __name__ == '__main__':
    cat_black = PetCat('小黑', 2)
    rest = cat_black.show_info
    print(rest) # 我叫小黑,今年2歲
    # 改變貓的age
    cat_black.age = 'hello'   # 負的 \ 超100 \字符串 都不行
    rest = cat_black.show_info
    print(rest)
    # print(cat_black)

  1. __slots__: 爲指定的類設置一個靜態屬性列表 ; 爲屬性很少的類節約內存空間
class PetCat(object):
    """ 家貓類 """

    __slots__ = ('name', 'age')

    def __init__(self, name, age):
        """
        構造方法
        :param name: 貓喫的名稱
        :param age: 貓的年齡
        """
        self.name = name
        # 私有屬性,不能給你們操作
        self.age = age

    # 描述符
    @property
    def show_info(self):
        """ 顯示貓的信息 """
        return '我叫:{0},今年{1}歲'.format(self.name, self.age)

    def __str__(self):
        return '我的對象: {0}'.format(self.name)


class HuaCat(PetCat):
    """ 中華田園貓 """
    __slots__ = ('color', )  #這個slots後邊加了東西
    pass


def eat():
    print('我喜歡喫魚')


if __name__ == '__main__':
    # cat_black = PetCat('小黑', 2)
    # rest = cat_black.show_info
    # print(rest)
    # # 給實例添加新的屬性
    # cat_black.color = '白色'
    # print(cat_black.color)
    # # 給實例添加新的方法(函數)
    # cat_black.eat = eat
    # cat_black.eat()

    # 使用slots後不允許給實例添加新的屬性
    # cat_black.color = '白色'
    # print(cat_black.color)
    # 使用slots後給實例添加新的方法(函數)
    # cat_black.eat = eat
    # cat_black.eat()

    cat_white = HuaCat('小白', 3)
    rest = cat_white.show_info
    print(rest)  # 我叫:小白,今年3歲
    cat_white.color = '白色'
    print(cat_white.color) # 白色
    cat_white.name = '旺旺' 
    print(cat_white.show_info) #我 叫:旺旺,今年3歲
 

類的靜態方法和實例方法

  • @staticmethod 表示靜態方法
  • @classmethod 表示類的方法


class Cat(object):

    tag = '貓科動物'

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

    @staticmethod
    def breath():
        """ 呼吸 """
        print('貓都需要呼吸空氣')

    @classmethod
    def show_info(cls, name):
        """ 顯示貓的信息 """
        # print('類的屬性:{0}, 實例的屬性: {1}'.format(cls.tag, cls.name))
        return cls(name)
        # cat = Cat(name)
        # return cat

    def show_info2(self):
        """ 顯示貓的信息 """
        # 設計模式
        print('類的屬性:{0}, 實例的屬性: {1}'.format(self.tag, self.name))


if __name__ == '__main__':
    # 通過類進行調用
    Cat.breath()
    cat = Cat('小黑')
    # # 通過類的實例進行調用
    cat.breath()
    cat.show_info2()

    # 調用classMethod
    cat2 = Cat.show_info('小黃')
    cat2.show_info2()

"""
貓都需要呼吸空氣
貓都需要呼吸空氣
類的屬性:貓科動物, 實例的屬性: 小黑
類的屬性:貓科動物, 實例的屬性: 小黃
"""
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章