天天看點

python 執行個體變量_Python的類變量和執行個體變量詳解

python 執行個體變量_Python的類變量和執行個體變量詳解

Asuka

什麼是類變量?

class Student:

name = 'Asuka'

age = '18'

...

上面定義的name和age就是類變量

什麼是執行個體變量?

class Student:

def __init__(self,name,age)

self.name = name

self.age = age

...

上面定義的name和age就是執行個體變量

類變量和執行個體變量的差別和應用

類變量為所有執行個體化後的類共享,有點類似繼承的概念,執行個體化後,每個執行個體都會有這個屬性,有種default的意味,可以設定一個帶預設值的屬性.

執行個體變量為每個執行個體化後的類獨有,因為python類執行個體化之後會自動調用init方法,如果您在類裡面定義了相同的屬性,那麼init下的執行個體變量會重寫相同的類變量.

一般來說,我們更多的運用執行個體變量,因為按照嚴格的面向對象思想,類的所有屬性都應該是執行個體的,類變量根本就不應該存在的,不過類變量偶爾還是有一點用處的,比如設定預設值和常量.

關于dict的說明

大家在序列化類,比如轉成json格式,許多同學會想到先把類轉成dict,然後再轉成json.于是,同學們可能會考慮用dict.

我想告訴同學們的一句話是,使用dict方法隻能序列化執行個體變量,無法序列化類變量.

如何寫出一個優美的面向對象的類

下面這句是關鍵

類應該儲存描述自身的特點和能夠實作的行為.

1.盡量多使用執行個體變量,不要總想把類裡面的資源return到外部

2.類下面的函數應該有操作執行個體變量的行為,也就是通常所說的方法

3.類裡面不能隻有staticmethod,classmethod這類的方法,因為這些還是面向過程的思維,不要一步步想着寫方法,根本沒用到自己執行個體的屬性

4.面向對象的思維其實就是一種造物主的思維,我們思考問題的時候要有一些靈性,少了什麼,我們就直接創造一個出來就行了,别和解數學題一樣,總是在想求解方程中x,y,z等于什麼.

如果大家有過python web程式設計經驗的話,就和編寫視圖函數是一樣的,我們編寫視圖函數的時候總是會事先假象我們有驗證層,模型層,視圖模型層等等分層,我們先定好整體的邏輯,事後再補齊對應層的函數,就和造物主有點類似,少了什麼我們直接new一個就行了(為什麼不能new一個對象出來呢?).

視圖函數内部總是會執行個體化一些驗證執行個體(wtforms),模型執行個體(sqlalchemy),業務邏輯等等内容,這些内容本來都是不存在的,都是我們在其他地方定義好的類或者函數,卻直接在視圖函數中用上來了.

Python 3.7的dataclass

from dataclasses import dataclass

@dataclass

class Student:

name:str

age:int

...

python 3.7版本中加了一個令人激動的dataclass裝飾器,簡單的實作類比上面,如果同學們比較反感編寫構造函數時候要編寫大量重複的代碼,可以嘗試下dataclass裝飾器.

這個裝飾器,不僅僅是簡寫代碼,直覺顯示資料類型,還可以進行資料比較,建立不可變屬性,使用post_init預處理變量等等好處.

如果想要更詳細了解這個新功能的細節,可以看下這篇文章--->https://linux.cn/article-9974-1.html

最後的留言

如果大家有什麼疑問,可以在下方留言或者私信我,看到我會回複的(就是很難及時回複了).

如果我上面說的有什麼錯誤,歡迎大家指正我(杠起來).

這是我的個人站點——一路香蕉皮,有興趣可以點選檢視下,裡面有軟體,教程,圖檔福利分享