2025-08-18 Python OOP

基本術(shù)語

  • 屬性 attribute
  • 方法 method
  • 接口是對象的一些屬性與方法的集合,其他對象可以用接口與這對象進(jìn)行交互;其他對象不需要,通常也不允許,獲取對象的全部內(nèi)容。
  • 信息隱藏。有時(shí)候也稱為封裝,但是封裝是一個(gè)更加寬泛的術(shù)語,被封裝的數(shù)據(jù)不一定是隱藏的。
  • 抽象是從內(nèi)部細(xì)節(jié)中提取公共接口的過程。
  • 抽象是通過公共或者私有接口進(jìn)行信息封裝的過程,私有接口通常與信息隱藏有關(guān)。
  • 組合是將幾個(gè)對象收集在一起生成一個(gè)新對象的行為。
  • 聚合 vs 組合
  • 繼承:一個(gè)類從另一個(gè)類中繼承屬性與方法
  • 讓一個(gè)類不實(shí)現(xiàn)任何方法。這樣一個(gè)類只會告訴我們它可以做什么,但是完全不告訴我們要如何去做,這種類叫做接口。
  • 多態(tài)是根據(jù)子類的不同實(shí)現(xiàn)而區(qū)別對待父類的能力。
  • 多種繼承:允許子類從多個(gè)父類那里繼承它們的功能。
  • dot notation 賦值 <對象>.<屬性>=<值>
  • 所有方法都有一個(gè)必要參數(shù),一般都命名為self
  • Python同時(shí)擁有構(gòu)造函數(shù)__new__和初始化方法__init__
  • 除非要做一些異乎尋常的事,否則很少用到構(gòu)造函數(shù)
  • 模塊(module)就是Python文件
  • 一個(gè)包(package)是一個(gè)目錄下模塊的集合,包的名字就是目錄的名字,只需要在目錄下添加一個(gè)名為__init__.py的文件(通常是空文件)就可以告訴Python這個(gè)目錄是一個(gè)包
  • 通常將啟動代碼放到一個(gè)函數(shù)中(慣例叫main),只有在將該模塊作為腳本運(yùn)行時(shí)才會執(zhí)行這一函數(shù),在被其他腳本導(dǎo)入時(shí)則不會執(zhí)行。
class UsefulClass:
    """This class might be useful to other modules."""
    pass

def main():
    """Creates a useful class and does something with it for our module."""
    useful = UsefulClass()
    print(useful)

if __name__ == "__main__":
    main()

虛擬環(huán)境

  • 通常為每個(gè)Python項(xiàng)目創(chuàng)建一個(gè)不同的虛擬環(huán)境
  • 通常將虛擬環(huán)境保存在與項(xiàng)目中其他文件相同的目錄中
  • 先cd到項(xiàng)目目錄
  • 運(yùn)行venv創(chuàng)建一個(gè)虛擬環(huán)境,命名為env
  • 最后用一行命令來激活環(huán)境
  • 完成項(xiàng)目后,用deactivate命令退出
cd project_directory
python -m venv env
source env/bin/activate # Linux或者M(jìn)ac os
env/bin/activate.bat # Windows系統(tǒng)

類與繼承

  • 超類,子類
  • 多重繼承;最有效的形式:混入(mixin)
  • 鉆石繼承
  • 抽象基類
  • 鴨子類型
  • 任何擁有__contains__方法的類都是Container;任何實(shí)現(xiàn)Container抽象基類的類都可以使用in關(guān)鍵字。in只是__contains__方法的語法糖。

異常

  • 大部分異常都是Exception類的子類
  • Exception類本身繼承自BaseException
  • 所有異常必須繼承BaseException類或其子類
  • SystemExitKeyboardInterrupt直接繼承自BaseException
    而不是Exception
  • SystemExit異常在程序自然退出時(shí)拋出,通常是代碼中調(diào)用了sys.exit函數(shù);設(shè)計(jì)這個(gè)異常的目的是在程序最終退出之前完成清理工作(因?yàn)榍謇泶a通常發(fā)生在finally語句中)
  • KeyboardInterrupt異常常見于命令行程序。當(dāng)用戶執(zhí)行依賴于系統(tǒng)的按鍵組合中斷程序時(shí)拋出,這是用戶故意中斷一個(gè)正在運(yùn)行的程序的標(biāo)準(zhǔn)方法。與SystemExit類似,應(yīng)該在finally塊中完成清理任務(wù)。
  • 當(dāng)我們僅用except從句而不添加任何類型的異常時(shí),將會捕獲所有BaseException的子類(不明智)。如果真的想捕獲所有的異常,建議使用except Exception

命名元組

  • Python默認(rèn)禁止向object以及其他幾個(gè)內(nèi)置類型添加任意屬性
  • 當(dāng)需要同時(shí)指定數(shù)據(jù)和行為的時(shí)候,才需要用到類和對象
  • 命名元組
from collections import namedtuple

Stock = namedtuple("Stock", "symbol current high low")
stock = Stock("FB", 75.00, high=75.03, low=74.90)
  • namedtuple構(gòu)造函數(shù)接收2個(gè)參數(shù):第一個(gè)是這個(gè)命名元組的名稱,第二個(gè)是由空格分隔的屬性的字符串
  • 命名元組的屬性一旦設(shè)定值就不能改變;如果需要修改存儲的數(shù)據(jù),用字典更合適

字典

  • Python字典的鍵(key)要求對象必須是可哈希(hashable) 和不可變(immutable) 的。這主要是出于字典實(shí)現(xiàn)機(jī)制(哈希表)對查找效率和一致性的要求
  • Python中自定義類的實(shí)例默認(rèn)是可哈希的。這是因?yàn)椋?
    1. 默認(rèn)哈希值基于對象內(nèi)存地址:如果你沒有重寫__hash__方法,Python會使用對象的唯一內(nèi)存地址來計(jì)算哈希值。這意味著每個(gè)新創(chuàng)建的實(shí)例通常都有唯一的哈希值(除非你重寫了相關(guān)方法改變了這一行為)。
    2. 默認(rèn)相等性比較基于對象身份:同樣,如果你沒有重寫__eq__方法,obj1 == obj2通常只在 obj1和 obj2是同一個(gè)實(shí)例(即內(nèi)存地址相同)時(shí)返回 True。
  • 這種默認(rèn)行為使得類的實(shí)例滿足了作為字典鍵的兩個(gè)核心要求:
    • 哈希值在生命周期內(nèi)不變:只要對象存在,其內(nèi)存地址不變,哈希值也就不變。
    • 可用于一致性比較:通過 __eq__方法判斷是否為同一個(gè)鍵。

defaultdict

  • defaultdict構(gòu)造函數(shù)需要一個(gè)函數(shù)作為參數(shù),每當(dāng)訪問一個(gè)字典中不存在的key時(shí),將會不帶參數(shù)地調(diào)用這個(gè)函數(shù),并將其結(jié)果設(shè)定為默認(rèn)值
from collections import defaultdict

def letter_frequency(sentence):
    frequencies = defaultdict(int)
    for letter in sentence:
        frequencies[letter] += 1
    return frequencies
  • 上例中調(diào)用的函數(shù)是int,即整數(shù)對象的構(gòu)造函數(shù)
  • 如果不帶參數(shù)地調(diào)用int,默認(rèn)會返回?cái)?shù)字0
from collections import defaultdict

num_items = 0
def tuple_counter():
    global num_items
    num_items += 1
    return num_items, []

d = defaultdict(tuple_counter)
d['a'][1].append("hello")
d['b'][1].append("world")
 d
# defaultdict(<function tuple_counter at 0x000001A8015751C0>, {'a': (1, ['hello']), 'b': (2, ['world'])})
  • d['a'][1].append("hello"),鍵值a不存在,因此會不帶參數(shù)地調(diào)用tuple_counter,得到的返回值是元組(1, []),然后對空list添加上了元素hello
  • d['b'][1].append("world"),鍵值b不存在,因此會再次不帶參數(shù)地調(diào)用tuple_counter,得到的返回值是元組(2, []),然后對空list添加上了元素world

Counter

  • key是輸入包含的項(xiàng)目,value是該項(xiàng)目出現(xiàn)的數(shù)量
  • most_common方法
    • 傳入正整數(shù)n,返回頻率前n的項(xiàng)
    • 列表,元素是(key, value)
responses = [
    'vanilla',
    'chocolate',
    'vanilla',
    'vanilla',
    'caramel',
    'strawberry',
    'vanilla'
]

print("The children voted for {} ice cream".format(
    Counter(responses).most_common(1)[0][0]
))
# The children voted for vanilla ice cream

Counter(responses).most_common(1)
# [('vanilla', 4)]
Counter(responses).most_common(2)
# [('vanilla', 4), ('chocolate', 1)]
Counter(responses).most_common(1)[0]
# ('vanilla', 4)
Counter(responses).most_common(1)[0][0]
# 'vanilla'

python -m http.server

會啟動一個(gè)運(yùn)行在8000端口的服務(wù)器,可以通過web瀏覽器訪問:http://localhost:8000/

更改端口為5678

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

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

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