包(lib)、模塊(module)
模塊:編寫Python代碼的py文件
包:用來分門別類存放模塊代碼的文件夾,【一般存在一個init.py文件】
一般創(chuàng)建一個包都會存在一個init.py文件用來導(dǎo)入其他模塊文件
你調(diào)用模塊的時候會自動生成一個緩存文件夾 要有緩存文件才可以導(dǎo)入 模塊
必須要有這個緩存才可以用如果直接引用別的文件夾的模塊不會成功
必須在這個init包里寫入其他模塊才可以導(dǎo)入只要聲明了就能直接導(dǎo)入
使用all=[] 方法導(dǎo)入
from 包名稱 import * 這樣就會生成init中所有的緩存模塊的,前提是必須將模塊寫進(jìn)init中
==和is使用:
. is 是比較兩個引用是否指向了同一個對象(地址引用比較)
== 是比較兩個對象是否相等。(比較的數(shù)值)
舉例:
a=10
b=10
a==b
True
a is b
True
is代表的是不是指向同一個內(nèi)存地址結(jié)果返回布爾
指向的是不是同一個堆,平時申請的數(shù)據(jù)類型都是在棧里面申請的
平常申請的-5~256數(shù)據(jù)都是在小整形緩沖數(shù)據(jù)里面存放
超過256或者小于-5都會返回false內(nèi)存地址改變
賦值:
將一個變量賦值給另一個變量,這個過程叫做賦值。
賦值會導(dǎo)致多個變量同時指向一塊內(nèi)存,所以此時不管是==或者is都返回True
當(dāng)a賦值給b的時候也會把內(nèi)存地址賦值給b 棧里面存放的是地址 他倆同時指向了堆

用id(列表名稱)來進(jìn)行查詢內(nèi)存地址
淺拷貝:
. 首先我們需要先引入我們的模塊import copy

此時他們兩個的內(nèi)存地址和指向的堆都不一樣
淺拷貝只能拷第一層也就是頂層數(shù)值,如果修改a或b里面第二層還是會發(fā)生變化
只修改第一層的數(shù)值b就不會發(fā)生變化了
深拷貝:
. 我們深拷貝的方法名稱為deepcopy

深拷貝可以拷貝里面所有的列表,所以不會發(fā)生變化
注意:


如果將列表改成元祖[]>()>" " 字符串也一樣 他們都指向數(shù)據(jù)區(qū)的同一塊值 他們出來的id地址都一樣跟賦值一樣
1.4.2使用property升級getter和setter方法
Python內(nèi)置的@property裝飾器就是負(fù)責(zé)把一個方法變成屬性調(diào)用的:
@property的實現(xiàn)比較復(fù)雜,我們先考察如何使用。把一個getter方法變成屬性,只需要加上@property就可以了,此時,@property本身又創(chuàng)建了另一個裝飾器@name.setter,負(fù)責(zé)把一個setter方法變成屬性賦值,于是,我們就擁有一個可控的屬性操作:
class User():
def __init__(self,name):
self.__name=name
@property 用我們python提供的@property方法,表示我要對name這個方法進(jìn)行標(biāo)識
def name(self):
return self.__name
@name.setter 這個表示是name的setter方法
def name(self,name):
self.__name=name
def shuo(self):
print("名字"+str(self.__name))
if __name__=="__main__":
a=User("趙某某",18,"男")
#a.set_name("劉某某")
a.name="劉某某"
print(a)
a.shuo()
小結(jié)
作用:
將方法轉(zhuǎn)換為只讀
重新實現(xiàn)一個屬性的設(shè)置和讀取方法
@property廣泛應(yīng)用在類的定義中,可以讓調(diào)用者寫出簡短的代碼,同時保證對參數(shù)進(jìn)行必要的檢查,這樣,程序運(yùn)行時就減少了出錯的可能性