python攻城獅004–面向對象
之前三篇
001-函數技巧\變量\包\標準庫
002-高階函數技巧-lambda\filter\map\reduce 函數
003–文件の讀寫
面向對象編程思想:
- 面向對象編程概述
- 面向對象編程實現
- 面向對象編程應用
- 內存管理
- 進程\線程\協程 概念及學習
概述
自然界
- 自然界 ---- ‘萬物皆對象’
- 面向對象:與對象面對面,關注它
編程界
類
是模子,確定對象會擁有它的屬性 & 方法(抽象的)對象
是類
的實例(看得見摸得到)- 類是對象的類型
- 對象是特定類型的數據
屬性和方法
屬性 :
對象具有的各種靜態特徵
方法 :
對象具有的各種動態行爲
面向對象優點
面向對象的三大特徵
封裝
將類的某些信息進行隱藏在內部,不允許外部程序直接訪問.
特點是:只能通過規定方法訪問數據;隱藏類的實例和細節,方便修改和實現.
- 通過該類提供的方法來實現對隱藏信息的操作和訪問
- 隱藏對象的信息
- 流出訪問的接口
舉例
: ATM 取錢 ; 接口:插卡\輸密碼\操作屏
繼承
什麼是繼承 : 就是繼承的屬性 ,又分爲 公有和私有屬性
以動物舉例:
- 私有: 名字\年齡\性別
- 公有: 喫\睡\跑 等
基 類 :
父類
派生類 :
子類
多態
意味着:
允許不同類的對象,對同一消息有不一樣的響應
- 滿足繼承關係
- 需要方法的重寫
類高級特性 : @property \ slots: \ 靜態方法 \ 類的方法
- @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)
__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()
"""
貓都需要呼吸空氣
貓都需要呼吸空氣
類的屬性:貓科動物, 實例的屬性: 小黑
類的屬性:貓科動物, 實例的屬性: 小黃
"""