Stories

Detail Return Return

【Python使用】嘿馬python高級進階全體系教程第13篇:My Awesome Book,property屬性【附 - Stories Detail

🏆🏆🏆教程全知識點簡介:1.靜態Web服務器涵蓋固定頁面數據返回、命令行啓動動態端口綁定。2. Python高級特性包括閉包變量修改、裝飾器(定義、語法糖、執行時間統計)、property屬性、with語句和上下文管理器、深拷貝和淺拷貝。3. 正則表達式涉及多字符匹配(*、{m,n})、開頭結尾匹配(^$)、字符排除匹配、分組匹配。4. 操作系統基礎包括操作系統概念、虛擬機軟件、Ubuntu系統、Linux內核及發行版。5. Linux命令系統涵蓋目錄查看、路徑操作、文件操作(ls、mkdir、rm、cp、mv)、重定向、文件內容查看、鏈接、壓縮解壓縮(tar、zip)。6. 系統管理包括文件權限(chmod)、用户權限(whoami、passwd)、用户創建、編輯器vim、軟件安裝卸載。7. 併發編程涵蓋多任務概念、進程(進程編號獲取、參數傳遞)、線程(執行特性、共享變量、死鎖處理)、進程線程對比、協程(概念、優點、gevent)。8. 網絡編程包括端口概念、TCP協議特點、socket使用、TCP開發流程、客户端服務端開發。9. HTTP協議涉及瀏覽器服務器通信、URL組成、開發者工具使用。

<!-- start:bj1 -->

📚📚倉庫code.zip 👉直接-->:   https://gitee.com/yinuo112/Backend/blob/master/Python/嘿馬pyt...    🍅🍅

<!-- end:bj1 -->

✨ 本教程項目亮點

🧠 知識體系完整:覆蓋從基礎原理、核心方法到高階應用的全流程內容
💻 全技術鏈覆蓋:完整前後端技術棧,涵蓋開發必備技能
🚀 從零到實戰:適合 0 基礎入門到提升,循序漸進掌握核心能力
📚 豐富文檔與代碼示例:涵蓋多種場景,可運行、可複用
🛠 工作與學習雙參考:不僅適合系統化學習,更可作為日常開發中的查閲手冊
🧩 模塊化知識結構:按知識點分章節,便於快速定位和複習
📈 長期可用的技術積累:不止一次學習,而是能伴隨工作與項目長期參考

🎯🎯🎯全教程總章節


🚀🚀🚀本篇主要內容

This file file serves as your book's preface, a great place to describe your book's content and ideas.

property屬性

學習目標

  • 能夠知道裝飾器方式的property屬性的定義方式

1. property屬性的介紹

property屬性就是負責把一個方法當做屬性進行使用,這樣做可以簡化代碼使用。

定義property屬性有兩種方式

  1. 裝飾器方式
  2. 類屬性方式

2. 裝飾器方式

class Person(object):

    def __init__(self):
        self.__age = 0

    # 裝飾器方式的property, 把age方法當做屬性使用, 表示當獲取屬性時會執行下面修飾的方法
    @property
    def age(self):
        return self.__age

    # 把age方法當做屬性使用, 表示當設置屬性時會執行下面修飾的方法
    @age.setter
    def age(self, new_age):
        if new_age >= 150:
            print("成精了")
        else:
            self.__age = new_age

  
  
# 創建person
  
  
p = Person()
print(p.age)
p.age = 100
print(p.age)
p.age = 1000

threading 文檔

運行結果:

0
100
成精了

email-validator 文檔

代碼説明:

FastAPI 文檔

  • @property 表示把方法當做屬性使用, 表示當獲取屬性時會執行下面修飾的方法
  • @方法名.setter 表示把方法當做屬性使用,表示當設置屬性時會執行下面修飾的方法
  • 裝飾器方式的property屬性修飾的方法名一定要一樣。

3. 類屬性方式

class Person(object):

    def __init__(self):
        self.__age = 0

    def get_age(self):
        """當獲取age屬性的時候會執行該方法"""
        return self.__age

    def set_age(self, new_age):
        """當設置age屬性的時候會執行該方法"""
        if new_age >= 150:
            print("成精了")
        else:
            self.__age = new_age

    # 類屬性方式的property屬性
    age = property(get_age, set_age)

  
  
# 創建person
  
  
p = Person()
print(p.age)
p.age = 100
print(p.age)
p.age = 1000

tqdm 文檔

運行結果:

0
100
成精了

代碼説明:

  • property的參數説明:

    • 第一個參數是獲取屬性時要執行的方法
    • 第二個參數是設置屬性時要執行的方法

4. 小結

  • 定義property屬性有兩種方式:

    1. 裝飾器方式
    2. 類屬性方式
  • 裝飾器方式:

    1. @property 修飾獲取值的方法
    2. @方法名.setter 修飾設置值的方法
  • 類屬性方式:

    1. 類屬性 = property(獲取值方法, 設置值方法)

with語句和上下文管理器

學習目標

  • 能夠知道自定義上下文管理器的兩種方式

1. with語句的使用

基礎班向文件中寫入數據的示例代碼:

  
  
# 1、以寫的方式打開文件
  
  
 f = open("1.txt", "w")
 # 2、寫入文件內容
 f.write("hello world")
 # 3、關閉文件
 f.close()

代碼説明:

  • 文件使用完後必須關閉,因為文件對象會佔用操作系統的資源,並且操作系統同一時間能打開的文件數量也是有限的

這種寫法可能出現一定的安全隱患,錯誤代碼如下:

  
  
# 1、以讀的方式打開文件
  
  
 f = open("1.txt", "r")
 # 2、讀取文件內容
 f.write("hello world")
 # 3、關閉文件
 f.close()

運行結果:

LightGBM 文檔

Traceback (most recent call last):
  File "/home/python/Desktop/test/xxf.py", line 4, in <module>
    f.write("hello world")
io.UnsupportedOperation: not writable

代碼説明:

  • 由於文件讀寫時都有可能產生IOError,一旦出錯,後面的f.close()就不會調用。
  • 為了保證無論是否出錯都能正確地關閉文件, 可以使用try ... finally來解決

安全寫法, 代碼如下:

try:
    # 1、以讀的方式打開文件
    f = open("1.txt", "r")
    # 2、讀取文件內容
    f.write("xxxxx")

except IOError as e:
    print("文件操作出錯", e)

finally:
    # 3、關閉文件
    f.close()

re 正則表達式

運行結果:

文件操作出錯 not writable

這種方法雖然代碼運行良好,但是缺點就是代碼過於冗長,並且需要添加try-except-finally語句,不是很方便,也容易忘記.

在這種情況下,Python提供了 with 語句的這種寫法,既簡單又安全,並且 with 語句執行完成以後自動調用關閉文件操作,即使出現異常也會自動調用關閉文件操作

with 語句的示例代碼:

  
  
# 1、以寫的方式打開文件
  
  
with open("1.txt", "w") as f:
    # 2、讀取文件內容
    f.write("hello world")

2. 上下文管理器

一個類只要實現了__enter__()和__exit__()這個兩個方法,通過該類創建的對象 就稱之為上下文管理器。

上下文管理器可以使用 with 語句,with語句之所以這麼強大,背後是由上下文管理器做支撐的,也就是説剛才使用 open 函數創建的文件對象就是就是一個上下文管理器對象。

自定義上下文管理器類,模擬文件操作:

定義一個File類,實現 __enter__() 和 __exit__()方法,然後使用 with 語句來完成操作文件, 示例代碼:

class File(object):

    # 初始化方法
    def __init__(self, file_name, file_model):
        # 定義變量保存文件名和打開模式
        self.file_name = file_name
        self.file_model = file_model

    # 上文方法
    def __enter__(self):
        print("進入上文方法")
        # 返回文件資源
        self.file = open(self.file_name,self.file_model)
        return self.file

    # 下文方法
    def __exit__(self, exc_type, exc_val, exc_tb):
        print("進入下文方法")
        self.file.close()


if __name__ == '__main__':

    # 使用with管理文件
    with File("1.txt", "r") as file:
        file_data = file.read()
        print(file_data)

運行結果:

進入上文方法
hello world
進入下文方法

代碼説明:

  • __enter__表示上文方法,需要返回一個操作文件對象
  • __exit__表示下文方法,with語句執行完成會自動執行,即使出現異常也會執行該方法。

3. 小結

  • Python 提供了 with 語句用於簡化資源釋放的操作,使用 with 語句操作建立在上下文管理器(實現__enter__和__exit__)的基礎上

生成器的創建方式

structlog 文檔

學習目標

  • 能夠知道生成器的兩種創建方式

1. 生成器的介紹

根據程序員制定的規則循環生成數據,當條件不成立時則生成數據結束。數據不是一次性全部生成出來,而是使用一個,再生成一個,可以節約大量的內存

2. 創建生成器的方式

  1. 生成器推導式
  2. yield 關鍵字

生成器推導式:

  • 與列表推導式類似,只不過生成器推導式使用小括號

Jupyter 文檔

  
  
# 創建生成器
  
  
my_generator = (i * 2 for i in range(5))
print(my_generator)

  
  
# next獲取生成器下一個值
  
  
  
  
# value = next(my_generator)
  
  
  
  
# print(value)
  
  

  
  
# 遍歷生成器
  
  
for value in my_generator:
    print(value)

代碼説明:

  • next 函數獲取生成器中的下一個值
  • for 循環遍歷生成器中的每一個值

運行結果:

<generator object <genexpr> at 0x101367048>
0
2
4
6
8

yield 關鍵字:

  • 只要在def函數裏面看到有 yield 關鍵字那麼就是生成器

reportlab 文檔

def mygenerater(n):
    for i in range(n):
        print('開始生成...')
        yield i
        print('完成一次...')


if __name__ == '__main__':

    g = mygenerater(2)
    # 獲取生成器中下一個值
    # result = next(g)
    # print(result)

    # while True:
    #     try:
    #         result = next(g)
    #         print(result)
    #     except StopIteration as e:
    #         break

    # # for遍歷生成器, for 循環內部自動處理了停止迭代異常,使用起來更加方便
    for i in g:
        print(i)

代碼説明:

  • 代碼執行到 yield 會暫停,然後把結果返回出去,下次啓動生成器會在暫停的位置繼續往下執行
  • 生成器如果把數據生成完成,再次獲取生成器中的下一個數據會拋出一個StopIteration 異常,表示停止迭代異常
  • while 循環內部沒有處理異常操作,需要手動添加處理異常操作
  • for 循環內部自動處理了停止迭代異常,使用起來更加方便,推薦大家使用。

運行結果:

開始生成...
0
完成一次...
開始生成...
1
完成一次...

3. 生成器的使用場景

數學中有個著名的斐波拉契數列(Fibonacci),數列中第一個數為0,第二個數為1,其後的每一個數都可由前兩個數相加得到:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...

現在 使用生成器來實現這個斐波那契數列,每次取值都通過算法來生成下一個數據, 生成器每次調用只生成一個數據,可以節省大量的內存。

def fibonacci(num):
    a = 0
    b = 1

    # 記錄生成fibonacci數字的下標
    current_index = 0

    while current_index < num:
        result = a
        a, b = b, a + b
        current_index += 1
        # 代碼執行到yield會暫停,然後把結果返回出去,下次啓動生成器會在暫停的位置繼續往下執行
        yield result


fib = fibonacci(5)
  
  
# 遍歷生成的數據
  
  
for value in fib:
    print(value)

運行結果:

0
1
1
2
3

4. 小結

  • 生成器是根據算法生成數據的一種機制,每次調用生成器只生成一個值,可以節省大量內存。
  • 生成器的創建有兩種方式:

      1. 生成器推導式
      1. yield 關鍵字

🚀✨ (未完待續)項目系列下一章

📚下一篇 將進入更精彩的環節!
🔔 記得收藏 & 關注,第一時間獲取更新!
🍅 一起見證整個系列逐步成型的全過程。
user avatar dirackeeko Avatar u_17569005 Avatar u_15214399 Avatar NobodyCares Avatar joe235 Avatar gomi Avatar ailvyoudetiebanshao Avatar huidadebianpao Avatar infinilabs Avatar iymxpc3k Avatar fiveyoboy Avatar smartbidashuju Avatar
Favorites 26 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.