上海交通大學 python程序設計課程PPT Ch7 (1)_第1頁
上海交通大學 python程序設計課程PPT Ch7 (1)_第2頁
上海交通大學 python程序設計課程PPT Ch7 (1)_第3頁
上海交通大學 python程序設計課程PPT Ch7 (1)_第4頁
上海交通大學 python程序設計課程PPT Ch7 (1)_第5頁
已閱讀5頁,還剩63頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、面向對象思想和編程面向對象思想和編程2 2 2回顧回顧 程序包括程序包括 數據數據數據類型數據類型,數據結構數據結構 處理過程處理過程算法算法 兩種程序設計思想兩種程序設計思想 面向過程面向過程:以操作為中心以操作為中心 面向對象面向對象:以數據為中心以數據為中心3 3 3數據與操作數據與操作:面向過程觀點面向過程觀點 程序就是對數據進行一系列的操作程序就是對數據進行一系列的操作 先表示數據先表示數據:常量常量,變量變量 再來處理數據再來處理數據x = 1y = 2z = x + yprint z 特點特點:數據與操作分離數據與操作分離 數據是被動的數據是被動的,操作是主動的操作是主動的4 4

2、以過程為中心以過程為中心 準備好數據之后準備好數據之后,主要是進行數據處理過主要是進行數據處理過程的設計程的設計,即算法設計即算法設計. 這種設計方法中這種設計方法中,數據通常對整個處理過數據通常對整個處理過程都是公開的程都是公開的,不能隱藏數據不能隱藏數據.x = 1y = 2z = x + yw = x y # 和上一行處理同樣的數據和上一行處理同樣的數據x,yz = z * w print z5 5復雜處理過程的設計復雜處理過程的設計 模塊化模塊化def op1(a,b): return a * a - b * b def op2(a,b): return a * b + b * a x

3、 = 1y = 2z = 3result1 = op1(x,y)result2 = op2(x,z)print result1 + result2 函數函數可以看作是更高可以看作是更高抽象級的操作抽象級的操作,與普通與普通操作似乎并無本質差別操作似乎并無本質差別.x = 1y = 2res = x + yprint res但函數有數據隱藏功能但函數有數據隱藏功能6 6函數與數據隱藏函數與數據隱藏 函數是功能黑箱函數是功能黑箱 使用者需要的只是函數的功能使用者需要的只是函數的功能,并不需要知并不需要知曉它內部是如何實現功能的曉它內部是如何實現功能的 函數內部處理的數據不對函數外部開放函數內部處理

4、的數據不對函數外部開放一個函數不能直接訪問另一個函數內部的數據一個函數不能直接訪問另一個函數內部的數據7 7小結小結:面向過程設計面向過程設計 數據與操作分離數據與操作分離,以操作過程為中心以操作過程為中心 先表示數據先表示數據 主要精力放在設計數據操作及其流程控制主要精力放在設計數據操作及其流程控制 對復雜程序采用自頂向下設計和模塊化設計對復雜程序采用自頂向下設計和模塊化設計將使用低級別操作的復雜過程設計成使用高級將使用低級別操作的復雜過程設計成使用高級別操作的簡單過程別操作的簡單過程 不適合的應用不適合的應用:如如GUI程序程序 沒有明確的執(zhí)行流程沒有明確的執(zhí)行流程,由不可預知的事件驅由不

5、可預知的事件驅動處理過程動處理過程8 8數據與操作數據與操作:面向對象觀點面向對象觀點 數據與操作不可分離數據與操作不可分離 數據類型概念已經提示我們數據類型概念已經提示我們:特定數據值和特定數據值和特定操作是不可分割的兩件事情特定操作是不可分割的兩件事情Q:請問請問x+y是什么意思是什么意思?A:+對不同類型的對不同類型的x,y值有不同意義值有不同意義. 既然如此既然如此,何不將特定數據值何不將特定數據值與特定操作捆綁在一起與特定操作捆綁在一起,形成一形成一種新型種新型數據數據? 由此產生了對象概念由此產生了對象概念9 9對象對象 對象對象(Object):集數據與操作于一身集數據與操作于一

6、身. 對象擁有特定數據對象擁有特定數據 對象能對其數據進行特定操作對象能對其數據進行特定操作 計算計算:向對象發(fā)操作請求消息向對象發(fā)操作請求消息. 對象是主動的對象是主動的,自己掌控對其數據的操作自己掌控對其數據的操作 對象將自己能執(zhí)行的操作對外公開對象將自己能執(zhí)行的操作對外公開 面向對象面向對象(Object-Oriented):軟件系統(tǒng)由各軟件系統(tǒng)由各種對象組成種對象組成,對象之間通過消息進行交互對象之間通過消息進行交互.1010對象例子對象例子 人人 數據數據:姓名姓名,出生日期出生日期,身高身高,體重體重,. 操作操作:計算年齡計算年齡,判斷體重是否標準判斷體重是否標準,. 電視機電視

7、機 數據數據:型號型號,廠商廠商,尺寸尺寸,頻道數頻道數,. 操作操作:開機開機,關機關機,調頻道調頻道,調音量調音量,. 室內環(huán)境室內環(huán)境 數據數據:溫度溫度,濕度濕度,容積容積,. 操作操作:調節(jié)溫度調節(jié)溫度,調節(jié)濕度調節(jié)濕度,換算容積換算容積單位單位1111面向過程面向過程vs面向對象編程面向對象編程 假設一個問題涉及數據假設一個問題涉及數據X和和Y,對對X要進行要進行的操作為的操作為f(),g(),對對Y的操作為的操作為h() 面向過程設計和面向對象得到的程序分別形面向過程設計和面向對象得到的程序分別形如如X = .Y = .f(X)g(X)h(Y)Xf()g()Yh()請求X執(zhí)行f(

8、)請求X執(zhí)行g()請求Y執(zhí)行h()121212復雜數據的表示復雜數據的表示 簡單數據可以用現成的數據類型表示簡單數據可以用現成的數據類型表示 每個數據類型都包括每個數據類型都包括 定義一個值的集合定義一個值的集合:如如int 定義一些對值的運算定義一些對值的運算(操作操作):如如+,-,*,/ 復雜數據如何表示復雜數據如何表示? 拆成簡單數據拆成簡單數據例如例如學生學生拆成拆成name,age,addr等簡單數據等簡單數據 定義新類型定義新類型例如定義類型例如定義類型S,其值是由其值是由name,age,addr等構成等構成的整體的整體131313自定義類型的值和操作自定義類型的值和操作 分離

9、分離 融為一體融為一體141414從類型到類從類型到類 類是類型概念的發(fā)展類是類型概念的發(fā)展 對象是廣義的對象是廣義的數據值數據值 對象所屬的數據類型就是對象所屬的數據類型就是類類 用于描述復雜數據的靜態(tài)和動態(tài)行為用于描述復雜數據的靜態(tài)和動態(tài)行為 類類(class):描述相似對象的共性描述相似對象的共性.包括包括 數據數據 操作操作:方法方法(method) 對象是類的對象是類的實例實例151515類與抽象類與抽象 類是對現實事物的抽象類是對現實事物的抽象 數據抽象數據抽象例如例如:從具體學生抽象出姓名從具體學生抽象出姓名,年齡年齡,地址等數據地址等數據 行為抽象行為抽象例如例如:從學生日常行

10、為抽象出選課從學生日常行為抽象出選課,加入社團等操加入社團等操作作 于是產生了類于是產生了類Student的定義的定義 抽象可以在多個層次上進行抽象可以在多個層次上進行 例如例如:學生學生-人人-動物動物-生物生物161616封裝封裝 封裝封裝:數據和操作結合成一個程序單元數據和操作結合成一個程序單元,對對外部隱藏內部實現細節(jié)外部隱藏內部實現細節(jié). 不允許用戶直接操作類中被隱藏的信息不允許用戶直接操作類中被隱藏的信息 用戶也無需了解隱藏的信息就能使用該類用戶也無需了解隱藏的信息就能使用該類 類對外公開方法名稱和調用格式類對外公開方法名稱和調用格式,即界面即界面. 外界向對象發(fā)消息外界向對象發(fā)消

11、息(方法名及參數方法名及參數) 對象響應消息對象響應消息,執(zhí)行相應方法執(zhí)行相應方法 外界只能按對象允許的方式來處理對象數據外界只能按對象允許的方式來處理對象數據171717封裝的好處封裝的好處 安全安全:對象自己的方法處理自己的數據對象自己的方法處理自己的數據 易用易用:使用者無需了解內部實現細節(jié)使用者無需了解內部實現細節(jié) 易維護易維護:實現者修改內部實現不會影響使實現者修改內部實現不會影響使用者用者 標準化標準化:同類甚至不同類的對象對使用者同類甚至不同類的對象對使用者都呈現同樣的操作界面都呈現同樣的操作界面類的定義類的定義 類定義類定義class : 方法定義同函數定義方法定義同函數定義d

12、ef (): .方法是依附于類的函數方法是依附于類的函數,普通函數則是獨立的普通函數則是獨立的.方法的第一個參數是專用的方法的第一個參數是專用的,習慣用名字習慣用名字self.具體含義見后具體含義見后.只能通過向對象發(fā)消息來調用方法只能通過向對象發(fā)消息來調用方法.18實例變量實例變量(1) 回憶回憶:對象是數據和操作的結合對象是數據和操作的結合. 類定義中類定義中,方法對應于操作方法對應于操作.數據呢數據呢? 對象的數據以實例變量形式定義對象的數據以實例變量形式定義. 實例變量實例變量self. 在方法中定義在方法中定義self. = 主要出現在主要出現在_init_()方法中方法中19實例變

13、量實例變量(2) 每個類實例每個類實例(對象對象)具有自己的實例變量副具有自己的實例變量副本本,用來存儲該對象自己的數據用來存儲該對象自己的數據. 對實例變量的訪問對實例變量的訪問:. 實例變量與函數局部變量不同實例變量與函數局部變量不同! 同一個類的各個方法都可以訪問實例變量同一個類的各個方法都可以訪問實例變量. 類的方法中也可以定義局部變量類的方法中也可以定義局部變量,不能被其不能被其他方法訪問他方法訪問.20212121例例:類定義類定義 類類Person(可單獨保存為模塊可單獨保存為模塊person.py)class Person: def _init_(self,n,y): self

14、.name = n self.year = y def whatName(self): print My name is, def howOld(self,y): age = y self.year if age 0: print My age in,y,is,age else: print I was born in,self.year 實例創(chuàng)建實例創(chuàng)建(1) 類與實例類與實例:抽象與具體抽象與具體. 人人是類是類,張三張三是人的實例是人的實例 一個類可以創(chuàng)建任意多個實例一個類可以創(chuàng)建任意多個實例各實例具有相同的行為各實例具有相同的行為:由方法決定由方法決定但具有不同的數據

15、但具有不同的數據:由實例變量決定由實例變量決定 實例創(chuàng)建實例創(chuàng)建 = () 這里這里相當于一個函數相當于一個函數,稱為構造器稱為構造器,用用來構造實例來構造實例.22實例創(chuàng)建實例創(chuàng)建(2) 創(chuàng)建時對實例進行初始化創(chuàng)建時對實例進行初始化 用構造器創(chuàng)建實例時用構造器創(chuàng)建實例時,系統(tǒng)會自動調用系統(tǒng)會自動調用_init_方法方法通常在此方法中執(zhí)行一些初始化操作通常在此方法中執(zhí)行一些初始化操作_init_所需的參數由構造器提供所需的參數由構造器提供. 例如例如: from person import Person p1 = Person(Lucy,2005) 23例例:實例創(chuàng)建實例創(chuàng)建(1) 創(chuàng)建一個創(chuàng)

16、建一個Person實例實例 from person import Person p1 = Person(Lucy,2005) 24例例:實例創(chuàng)建實例創(chuàng)建(2) 創(chuàng)建兩個創(chuàng)建兩個Person實例實例 from person import Person p1 = Person(Lucy,2005) p2 = Person(Tom,1990) 25方法調用方法調用 類似函數調用類似函數調用,但需指明實例但需指明實例(對象對象).() 就是與形參就是與形參self對應的實參對應的實參. 例如例如 p1.whatName()My name is Lucy p2.whatName()My name is

17、Tom p2.howOld(2013)My age in 2013 is 23 26方法調用圖示方法調用圖示 p1.whatName() p2.howOld(2013)27編程案例編程案例:模擬炮彈飛行模擬炮彈飛行(1) 程序規(guī)格程序規(guī)格 輸入輸入:炮彈的發(fā)射角度炮彈的發(fā)射角度,初速和高度初速和高度 輸出輸出:炮彈的射程炮彈的射程 解決方法解決方法:模擬炮彈飛行過程模擬炮彈飛行過程,即計算每一即計算每一時刻炮彈的位置時刻炮彈的位置. 連續(xù)運動的離散化連續(xù)運動的離散化時間時間:t, t+ t, t+2 t, t+3 t, .軌跡軌跡: (xt,yt), (xt+ t,yt+ t), .28編程案

18、例編程案例:模擬炮彈飛行模擬炮彈飛行(2) 算法算法:輸入角度輸入角度angle(度度),初速初速v(米米/秒秒),高度高度h0(米米),間隔間隔t(秒秒)將將angle換算成弧度單位的換算成弧度單位的thetaxv = v * cos(theta)yv = v * sin(theta)初始位置初始位置(xpos,ypos) = (0,h0)當炮彈還未落地當炮彈還未落地(即即ypos = 0.0): 更新炮彈位置更新炮彈位置(xpos,ypos) 更新更新yv 輸出輸出xpos 29編程案例編程案例:模擬炮彈飛行模擬炮彈飛行(3) 核心代碼核心代碼:位置更新位置更新 水平方向水平方向xpos

19、= xpos + xv * t 垂直方向垂直方向yv1 = yv - 9.8 * typos = ypos + (yv + yv1) / 2.0 * t30from math import pi, sin, cosdef main(): angle = input(Enter the launch angle: ) vel = input(Enter the initial velocity: ) h0 = input(Enter the initial height : ) time = input(Enter the time interval : ) radians = (angle *

20、 pi)/180.0 xpos = 0 ypos = h0 xvel = vel * cos(radians) yvel = vel * sin(radians) while ypos = 0: xpos = xpos + time * xvel yvel1 = yvel - 9.8 * time ypos = ypos + time * (yvel + yvel1)/2.0 yvel = yvel1 print nDistance traveled: %0.1f meters. % (xpos)main()這個版本是流水帳式的,沒有章法結構.程序不長,倒有10個變量,為理解程序需要跟蹤這10

21、個數據的變化.編程案例編程案例:模擬炮彈飛行模擬炮彈飛行(4) 模塊化版本模塊化版本cball2.py 主程序主程序(主函數主函數)非常簡潔非常簡潔,易理解易理解.def main():angle, v, h0, t = getInputs()xv, yv = getXY(v,angle)xpos = 0ypos = h0while ypos = 0:xpos,ypos,yv = update(t,xpos,ypos,xv,yv)print 射程射程: %0.1f 米米. % (xpos) 將輔助性變量將輔助性變量(theta和和yv1)隱藏在輔助函數中隱藏在輔助函數中. 仍然不夠好仍然不夠好

22、:update函數界面太復雜函數界面太復雜.32編程案例編程案例:模擬炮彈飛行模擬炮彈飛行(5) 面向對象版本面向對象版本cball3.py炮彈是現實實體炮彈是現實實體, ,用用xpos,ypos,xv和和yv四個分離的數四個分離的數據來描述它是據來描述它是“只見樹木不見森林只見樹木不見森林”. . OOP:將炮彈的信息和行為都封裝在類中將炮彈的信息和行為都封裝在類中,并創(chuàng)建一并創(chuàng)建一個炮彈對象個炮彈對象,程序會更加簡潔易理解程序會更加簡潔易理解.def main(): angle, vel, h0, time = getInputs() cball = Projectile(angle, v

23、el, h0) while cball.getY() = 0: cball.update(time) print 射程射程: %0.1f 米米. % (cball.getX()所有復雜性都隱藏在類中了所有復雜性都隱藏在類中了33from math import pi, sin, cosclass Projectile:def _init_(self, angle, velocity, height): self.xpos = 0.0 self.ypos = height theta = pi * angle / 180.0 self.xvel = velocity * cos(theta) s

24、elf.yvel = velocity * sin(theta)def update(self, time):self.xpos = self.xpos + time * self.xvel yvel1 = self.yvel - 9.8 * time self.ypos = self.ypos + time * (self.yvel + yvel1) / 2.0 self.yvel = yvel1def getY(self): return self.yposdef getX(self): return self.xpos編程案例編程案例:模擬炮彈飛行模擬炮彈飛行(6) 三個版本體現的思想變

25、遷三個版本體現的思想變遷35類與模塊化類與模塊化 復雜程序的模塊化設計復雜程序的模塊化設計 功能分解功能分解:利用子程序利用子程序(如函數如函數)概念概念,以過程以過程為中心設計功能模塊為中心設計功能模塊 數據分解數據分解:利用類的概念利用類的概念,以數據為中心設計以數據為中心設計數據模塊數據模塊 功能模塊不太適合復雜數據的處理功能模塊不太適合復雜數據的處理 類模塊獨立性更高類模塊獨立性更高,可重用性更好可重用性更好 類定義可以提供給任何程序使用類定義可以提供給任何程序使用 很多很多OO語言都提供類庫語言都提供類庫36例例:學生信息處理系統(tǒng)學生信息處理系統(tǒng) 功能分解功能分解 課程注冊模塊課程注

26、冊模塊,修改學生信息模塊修改學生信息模塊,成績登錄成績登錄模塊等模塊等 每個模塊每個模塊(函數函數)都需要了解都需要了解”學生學生”數據的細數據的細節(jié)節(jié) 數據分解數據分解 創(chuàng)建創(chuàng)建”學生學生”類類S,隱藏數據和操作實現細節(jié)隱藏數據和操作實現細節(jié),使使用者無需了解內部細節(jié)就能執(zhí)行操作用者無需了解內部細節(jié)就能執(zhí)行操作 其他數據模塊包括其他數據模塊包括”課程課程”類類,”教師教師”類等類等37如何表示任意復雜的數據如何表示任意復雜的數據 數據的復雜性表現在數據的復雜性表現在 數量大數量大:用集合體數據類型來表示用集合體數據類型來表示 有內部深層結構有內部深層結構:用類來表示用類來表示 兩種復雜性混合

27、兩種復雜性混合:用用對象的集合對象的集合來刻畫來刻畫 people = p1, p2 for p in people: p.whatName() p.howOld(2013) 38393939超類與子類超類與子類* 子類子類 繼承繼承 覆寫覆寫 多態(tài)多態(tài)404040面向對象設計面向對象設計* OOD:對給定問題找出并定義一組有用的對給定問題找出并定義一組有用的類的過程類的過程. 基于詞性分析的一種方法基于詞性分析的一種方法 問題描述問題描述 描述中的名詞描述中的名詞(事物事物) 問題描述中的動詞問題描述中的動詞(對象行為對象行為)41EndFunctions that Modify Param

28、etersnReturn values are the main way to send information from a function back to the caller.nSometimes, we can communicate back to the caller by making changes to the function parameters.nUnderstanding when and how this is possible requires the mastery of some subtle details about how assignment wor

29、ks and the relationship between actual and formal parameters.Functions that Modify ParametersnSuppose you are writing a program that manages bank accounts. One function we would need to do is to accumulate interest on the account. Lets look at a first-cut at the function.ndef addInterest(balance, ra

30、te): newBalance = balance * (1 + rate) balance = newBalanceFunctions that Modify ParametersnThe intent is to set the balance of the account to a new value that includes the interest amount.nLets write a main program to test this:def test(): amount = 1000 rate = 0.05 addInterest(amount, rate) print a

31、mountFunctions that Modify ParametersnWe hope that that the 5% will be added to the amount, returning 1050.n test()1000nWhat went wrong? Nothing!Functions that Modify ParametersnThe first two lines of the test function create two local variables called amount and rate which are given the initial val

32、ues of 1000 and 0.05, respectively.def addInterest(balance, rate): newBalance = balance * (1 + rate) balance = newBalancedef test(): amount = 1000 rate = 0.05 addInterest(amount, rate) print amountFunctions that Modify ParametersnControl then transfers to the addInterest function.nThe formal paramet

33、ers balance and rate are assigned the values of the actual parameters amount and rate.nEven though rate appears in both, they are separate variables (because of scope rules).def addInterest(balance, rate): newBalance = balance * (1 + rate) balance = newBalancedef test(): amount = 1000 rate = 0.05 ad

34、dInterest(amount, rate) print amountFunctions that Modify ParametersnThe assignment of the parameters causes the variables balance and rate in addInterest to refer to the values of the actual parameters!def addInterest(balance, rate): newBalance = balance * (1 + rate) balance = newBalancedef test():

35、 amount = 1000 rate = 0.05 addInterest(amount, rate) print amountFunctions that Modify ParametersFunctions that Modify ParametersnExecuting the first line of addInterest creates a new variable, newBalance.nbalance is then assigned the value of newBalance.def addInterest(balance, rate): newBalance =

36、balance * (1 + rate) balance = newBalancedef test(): amount = 1000 rate = 0.05 addInterest(amount, rate) print amountFunctions that Modify Parametersnbalance now refers to the same value as newBalance, but this had no effect on amount in the test function.def addInterest(balance, rate): newBalance =

37、 balance * (1 + rate) balance = newBalancedef test(): amount = 1000 rate = 0.05 addInterest(amount, rate) print amountFunctions that Modify ParametersFunctions that Modify ParametersnExecution of addInterest has completed and control returns to test.nThe local variables, including the parameters, in

38、 addInterest go away, but amount and rate in the test function still refer to their initial values!def addInterest(balance, rate): newBalance = balance * (1 + rate) balance = newBalancedef test(): amount = 1000 rate = 0.05 addInterest(amount, rate) print amountFunctions that Modify ParametersnTo sum

39、marize: the formal parameters of a function only receive the values of the actual parameters. The function does not have access to the variable that holds the actual parameter.nPython is said to pass all parameters by value.Functions that Modify ParametersnSome programming languages (C+, Ada, and ma

40、ny more) do allow variables themselves to be sent as parameters to a function. This mechanism is said to pass parameters by reference.nWhen a new value is assigned to the formal parameter, the value of the variable in the calling program actually changes.Functions that Modify ParametersnSince Python

41、 doesnt have this capability, one alternative would be to change the addInterest function so that it returns the newBalance.Functions that Modify Parametersdef addInterest(balance, rate): newBalance = balance * (1 + rate) return newBalancedef test(): amount = 1000 rate = 0.05 amount = addInterest(am

42、ount, rate) print amounttest()Functions that Modify ParametersnInstead of looking at a single account, say we are writing a program for a bank that deals with many accounts. We could store the account balances in a list, then add the accrued interest to each of the balances in the list.nWe could upd

43、ate the first balance in the list with code like:balances0 = balances0 * (1 + rate)Functions that Modify ParametersnThis code says, “multiply the value in the 0th position of the list by (1 + rate) and store the result back into the 0th position of the list.”nA more general way to do this would be w

44、ith a loop that goes through positions 0, 1, , length 1.Functions that Modify Parametersdef addInterest(balances, rate): for i in range(len(balances): balancesi = balancesi * (1+rate)def test(): amounts = 1000, 2200, 800, 360 rate = 0.05 addInterest(amounts, rate) print amountstest()Functions that M

45、odify ParametersnRemember, our original code had these values:1000, 2200, 800, 360n The program returns:1050.0, 2310.0, 840.0, 378.0nWhat happened? Python passes parameters by value, but it looks like amounts has been changed!Functions that Modify ParametersnThe first two lines of test create the variables amounts and rate.nThe value of the variable amounts is a list object that contains four int values.def addInterest(balances, rate): for i in range(l

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論