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就是實例變量
類變量和實例變量的區(qū)別和應(yīng)用
類變量為所有實例化后的類共享,有點類似繼承的概念,實例化后,每個實例都會有這個屬性,有種default的意味,可以設(shè)置一個帶默認值的屬性.
實例變量為每個實例化后的類獨有,因為python類實例化之后會自動調(diào)用init方法,如果您在類里面定義了相同的屬性,那么init下的實例變量會重寫相同的類變量.
一般來說,我們更多的運用實例變量,因為按照嚴格的面向?qū)ο笏枷?類的所有屬性都應(yīng)該是實例的,類變量根本就不應(yīng)該存在的,不過類變量偶爾還是有一點用處的,比如設(shè)置默認值和常量.
關(guān)于dict的說明
大家在序列化類,比如轉(zhuǎn)成json格式,許多同學(xué)會想到先把類轉(zhuǎn)成dict,然后再轉(zhuǎn)成json.于是,同學(xué)們可能會考慮用dict.
我想告訴同學(xué)們的一句話是,使用dict方法只能序列化實例變量,無法序列化類變量.
如何寫出一個優(yōu)美的面向?qū)ο蟮念?/p>
下面這句是關(guān)鍵
類應(yīng)該保存描述自身的特點和能夠?qū)崿F(xiàn)的行為.
1.盡量多使用實例變量,不要總想把類里面的資源return到外部
2.類下面的函數(shù)應(yīng)該有操作實例變量的行為,也就是通常所說的方法
3.類里面不能只有staticmethod,classmethod這類的方法,因為這些還是面向過程的思維,不要一步步想著寫方法,根本沒用到自己實例的屬性
4.面向?qū)ο蟮乃季S其實就是一種造物主的思維,我們思考問題的時候要有一些靈性,少了什么,我們就直接創(chuàng)造一個出來就行了,別和解數(shù)學(xué)題一樣,總是在想求解方程中x,y,z等于什么.
如果大家有過python web編程經(jīng)驗的話,就和編寫視圖函數(shù)是一樣的,我們編寫視圖函數(shù)的時候總是會事先假象我們有驗證層,模型層,視圖模型層等等分層,我們先定好整體的邏輯,事后再補齊對應(yīng)層的函數(shù),就和造物主有點類似,少了什么我們直接new一個就行了(為什么不能new一個對象出來呢?).
視圖函數(shù)內(nèi)部總是會實例化一些驗證實例(wtforms),模型實例(sqlalchemy),業(yè)務(wù)邏輯等等內(nèi)容,這些內(nèi)容本來都是不存在的,都是我們在其他地方定義好的類或者函數(shù),卻直接在視圖函數(shù)中用上來了.
Python 3.7的dataclass
from dataclasses import dataclass
@dataclass
class Student:
name:str
age:int
...
python 3.7版本中加了一個令人激動的dataclass裝飾器,簡單的實現(xiàn)類比上面,如果同學(xué)們比較反感編寫構(gòu)造函數(shù)時候要編寫大量重復(fù)的代碼,可以嘗試下dataclass裝飾器.
這個裝飾器,不僅僅是簡寫代碼,直觀顯示數(shù)據(jù)類型,還可以進行數(shù)據(jù)比較,創(chuàng)建不可變屬性,使用post_init預(yù)處理變量等等好處.
如果想要更詳細了解這個新功能的細節(jié),可以看下這篇文章--->https://linux.cn/article-9974-1.html
最后的留言
如果大家有什么疑問,可以在下方留言或者私信我,看到我會回復(fù)的(就是很難及時回復(fù)了).
如果我上面說的有什么錯誤,歡迎大家指正我(杠起來).
這是我的個人站點——一路香蕉皮,有興趣可以點擊查看下,里面有軟件,教程,圖片福利分享
總結(jié)
以上是生活随笔為你收集整理的python 实例变量_Python的类变量和实例变量详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python小课文件_[Python]小
- 下一篇: python3.8安装pygame_Py