請問影片20:25這裡我的顯示 PS D:\python-training> & "C:/Users/Lin Hung Yu/AppData/Local/Programs/Python/Python38-32/python.exe" d:/python-training/TH-cam/instance.py Traceback (most recent call last): File "d:/python-training/TH-cam/instance.py", line 53, in f1.open() File "d:/python-training/TH-cam/instance.py", line 48, in open self.file=open(self.name,mode="r",encoding="utf-8") FileNotFoundError: [Errno 2] No such file or directory: 'data1.txt' 之前影片介紹modules時也有類似問題,跪求解答
一個完全沒有編程知識的新手, 學懂了python, 完全是因為老師超易懂的教導, 十分感謝老師啊!
很感謝你逐一的回饋,能夠對你有幫助我覺得很棒 :)
每部影片好像都有你啊....
回頭翻老師教的,用實務最常用的讀取檔案函式,成功了,感謝彭彭老師,我分享如下:
class File:
def __init__(self,name):
self.name = name
self.file = None #尚未開啟檔案時是None
def Open(self): #開啟檔案(會自動關閉檔案)+讀取檔案函式
with open(self.name, mode = "r", encoding="utf-8") as self.file:
return self.file.read()
p = File("data.txt") #建立物件
data =p.Open() #開啟並讀取檔案
print(data)
感謝你的分享 :)
從第一部到目前觀看為止的集數,越到後面的影片內容,充分體驗到知識累加到最後化繁為簡的價值。
謝謝作者的製作。
讚讚,很棒的回饋 :)
超級感謝彭彭老師!
# 實體物件的建立與使用-下篇
# 類別的兩種用法
# 1.類別與類別屬性
# 2.類別與實體物件、實體屬性、實體方法
# 實體屬性 : 封裝在實體物件中的變數
# 程式範例
class Point:
def __init__(self,x,y):
self.x=x
self.y=y
# 建立實體物件,並取得實體屬性資料
p=Point(1,5)
print(p.x+p.y)
# 實體方法 : 封裝在實體物件中的函式
# 基本語法
#class 類別名稱:
# 定義初始化函式
# def __init__(self):
# 定義實體屬性
# 定義實體方法/函式
# 建立實體物件,放入變數obj中
#obj=類別名稱()
# 寫更細一點
# 基本語法
#class 類別名稱:
# 定義初始化函式
# def __init__(self):
# 封裝在實體物件中的變數
# def 方法名稱(self,更多自訂參數):
# 方法主體,透過 self 操作實體物件
# 建立實體物件,放入變數obj中
#obj=類別名稱()
# 基本語法
# 實體物件.實體方法名稱(參數資料)
# 程式範例
class Point:
def __init__(self,x,y):
self.x=x
self.y=y
def show(self):
print(self.x,self.y)
p=Point(1,5) # 建立實體物件
p.show() # 呼叫實體方法
#----------------------------
# Point 實體物件的設計: 平面座標上的點
class Point:
def __init__(self,x,y):
self.x=x
self.y=y
# 定義實體方法(特色是self一定要寫) (其實就是封裝在類別內的函式)
def show(self):
print(self.x,self.y)
def distance(self,targetX,targetY):
return(((self.x-targetX)**2+(self.y-targetY)**2)**(1/2))
p=Point(3,4)
p.show() # 呼叫實體方法 / 函式
answer=p.distance(0,0)
print(answer) # 記標座標 3,4 和座標 0,0 之間的距離
# File 實體物件的設計: 包裝檔案讀取的程式
class File:
# 初始化函式 建立實體物件
def __init__(self,name):
self.name=name
self.file=None # 尚未開啟檔案: 初期是 None
# 實體方法
def open(self): # 這是我們建立的開啟檔案的方法
self.file=open(self.name,mode="r",encoding="utf-8") # 這是 python 內建的開啟檔案的函式
def read(self):
return self.file.read()
# 讀取第一個檔案
f1=File("data1.txt")
f1.open()
data=f1.read()
print(data)
# 讀取第二個檔案
f2=File("data2.txt")
f2.open()
data=f2.read()
print(data)
:)
類別的兩種用法:
1.類別與類別屬性
2.類別與實體物件、實體屬性、實體方法
《實體屬性》封裝在實體物件中的變數
《程式範例》
class Point:
def __init__(self,x,y):
self.x = x
self.y = y
# 建立實體物件,並取得實體屬性資料
p = Point(1,5)
print(p.x+p.y)
*實體方法*
《實體方法》封裝在實體物件中的函式
《基本語法01》
class 類別名稱:
# 定義初始化函式
def __init__(self):
定義實體屬性
定義實體方法/函式
# 建立實體物件,放入變數obj中
obj = 類別名稱()
《基本語法02》
class 類別名稱:
# 定義初始化函式
def __init__(self):
封裝在實體物件中的變數
def 方法名稱(self,更多自訂參數):
方法主體,透過self操作實體物件
# 建立實體物件,放入變數obj中
obj = 類別名稱()
*使用方法*
《基本語法》實體物件.實體方法名稱(參數資料)
《程式範例》
class Point:
def __init__(self,x,y):
self.x = x
self.y = y
def show(self):
print(self.x,self.y)
p = Point(1,5) # 建立實體物件
p.show() # 呼叫實體方法
# Point 實體物件的設計:平面座標上的點
class Point:
def __init__(self,x,y):
self.x = x
self.y = y
# 定義實體方法
def show(self):
print(self.x,self.y) # >>> 3 4
def distance(self,targetX,targetY):
return (((self.x-targetX)**2)+((self.y.targetY)**2)**0.5)
p = Point(3,4)
p.show() # 呼叫實體方法/函式
result = p.distance(0,0)
print(result) # >>> 5.0
# File 實體物件的設計:包裝檔案讀取的程式
class file:
# 初始化函式
def __init__(self,name):
self.name = name
self.file = None # 尚未開啟檔案:初期是None 代表空的意思
# 實體方法
def open(self):
self.file = open(self.name, mode="r",encoding="utf-8")
def read(self):
return self.file.read()
# 讀取第一個檔案
f1 = file("data1.txt")
f1.open()
data = f1.read()
print(data)
>>> 哈哈哈哈哈哈
# 讀取第二個檔案
f2 = file("data2.txt")
f2.open()
data = f2.read()
print(data)
>>> 測試測試測試測試
:)
我是最近初學的.. 從第一天學到此篇,每天老師都講解的易懂,非常謝謝!
謝謝你的回饋,有幫助就好 :)
不知道还有人在学习python实体物件的建立与使用下篇么,这个视频我看了三遍怎么也想不通为什么open(self)不需要回传值,而read(self)需要回传,我思考了好久也没想出个所以然,最后还是在ChatGPT帮助下找到了答案.其他的部分我觉得还是很容易看懂的,不是我多聪明,而是老师讲的很到位,只要仔细认真听,都能明白,对于一个纯小白来的我说非常希望看到类似的教程,教的真细真好
感谢你的回馈,我会再多想想如何把事情讲更清楚,也很高兴你最终有找到答案 :)
後面open和read例子對於跟我一樣沒有理解根源就無法學會的人 , 在看完之後在腦袋卡住中整個跳脫出來了 , 老師舉例的方式真的教的很棒!!!!
讚讚,很棒的回饋,很高興對你有幫助 :)
謝謝老師的教學,比學校老師教得好太多了,讓我省了很多時間,效率uppppppp !!!!!
讚讚,一起加油哪 :)
self可以想成當用自定義的class宣告了一個instance, self就是代表那個那個instance, 只是在定義class時還不會知道之後的instance什麼所以先用self表示
感謝你的分享 :)
上完目前為止更新的課程了~
教學真的太棒了
不自覺的跟著認真練習起來了~
期待未來的更新
謝謝彭彭老師~
很高興對你有正面的幫助 :)
老師是網路上講的最清晰的影片....!
希望老師有空能夠多出影片 >
謝謝你,我會盡量 :)
謝謝彭彭老師,有過學C++,在看老師的影片,真的很快就可以熟悉Python
有學過 C++ 的話 Python 應該算是比較簡單愉快的,很高興對你有幫助哦 :)
非常謝謝彭彭老師,讓我這個python小白能夠用最輕鬆的方式學到這裡
太好了,很高興對你有幫助 :)
老師教得真的很淺顯易懂!!
謝謝你的回饋 :)
謝謝老師無私教學!!!真的很喜歡這個頻道,也推薦給我許多朋友了 :)
不客氣呦,也謝謝你的分享 :))
彭彭老師說的都很好懂(發自內心的讚嘆),謝謝😊
謝謝你的回饋 😊😊😊
甚至感謝老師的教學!
逐步建立py世界
讚讚,希望你的 Python 世界非常的豐富多元 :))))
老師教得很用心,容易明白,谢谢🙏
謝謝你的回饋呦 ~~~~~~~
看了幾部就受不了跑去訂閱
中文程式學習資源的瑰寶
謝謝支持和回饋 :)
老師你好,我最近開始自學這款軟體,有幸可以看到老師簡潔清楚的教學,先謝謝彭彭老師。
老師我對你這部教學裡面有的小問題,就是最後一段有關多重檔案的開啟及讀取是使用open指令,這個指令老師在之前有提到過很重要的一個點是要記得關閉檔案(當時還有多學with),但在這邊是否有需要在類別補寫個:
def close(self):
self.file.close()
在開啟檔案的最後要補寫個close關閉:
f1=File("data1.txt")
f1.open()
data=f1.read()
print(data)
f1.close()
最後把檔案關掉,避免佔用電腦資源?
對,能關閉是比較好的,我在這裡算是偷懶了,但只要程式正常結束,檔案也會自動被關閉就是,所以也沒這麼嚴重 :)
了解,謝謝老師
釐清了很多東西,感謝老師!
這樣寫程式的時候就很順了!
讚讚,很高興有幫助到你 :)
感恩彭彭老師
:)
這邊解釋,讓我了解之前的一些困惑了!!
之前使用模組或函式,有些像是後面 + .sort() .pop(), 一直不確定() 裡面為什麼可以空的。現在總算知道他們是怎樣運作了!
謝謝老師講解
很高興有幫到你的忙哦,讚讚 :)
老师谢谢你,终于看完你更新得了
不客气 :)
請問老師,為甚麼在初始化涵式要先定義file=None,如果是在實體方法中需要用的變數,都需要再初始化涵式當中先定義嗎?
可以不用定義哦,但我的主觀意見覺得在初始化的時候定義清楚它是空值,是個好主意 ~
這一段在自修看書時有點不理解,,看了彭彭老師的教學影片,幫助很大,清晰很多了!! 謝謝!!
太好了 :)
老師您好,這裡講的實體物件建立,是否與前面所教的Package封包設計的概念很像?
差別在於實體物件是用class在主程式中定義,而Package是用import將其他函式寫入主程式
我的理解正確嗎?
封裝 ( 把資料或函式整合成一個整體 ) 的概念是有點像沒錯。
但如你所說,手段是不同的,一個是透過資料夾和檔案來封裝,另一個就是直接用 class 的概念封裝 :)
wow 終於把全部都看完了
謝謝老師的無私分享以及教導
有點傷心這可能是最後一個
謝謝老師寶貴的時間
希望 接下來能推出線上教成
或著是推動更高級的課程
但不要求任何 因為已經滿足了 ;))
感謝老師寶貴無私的貢獻
祝福您 :))
謝謝你認真用心的回饋 :)
其實我不介意盡可能地把知識放上來,只要我在基本的工作之外還有餘力,
原則上都會持續的更新嘍,頻率就比較不一定而已 XD ~
謝謝老師的教學,讓我這個新手非常容易了解並上手,想請問一下老師,python能夠在函式中傳入class當引樹嗎? (例如這邊的distance函式變成傳入另一個point)
可以傳入另一個實體物件沒問題,你描述的情境也是沒問題的,不過一般不會傳入 class
老師不好意思想請問一下,因為程式碼都與您打得相同,最後卻出現
Traceback (most recent call last):
File "C:\Users\User\Desktop\python tran\instance.py", line 34, in
p.show() #呼叫實體方法
^^^^^^
AttributeError: 'Point' object has no attribute 'show'
我打的
class Point:
def __init__(self, x, y):
self.x=x
self.y=y
# 定義實體方法
def show(self):
print(self.x, self.y)
def distance(self,targetX,targetY):
return (((self.x-targetX)**2)+((self.y-targetY)**2))**0.5
p=Point(3,4)
p.show() #呼叫實體方法
p.distance(0,0) #計算座標3,4 座標00 的距離
print(result)
想請問問題出在哪呢 謝謝
show 和 distance 的縮排不對,要和 __init__ 在同一層次的縮排中。
@@cwpeng-course 阿里嘎都老師
老師你好, 我想請問我這樣寫和您影片最後的那段寫法有何不同嗎?
因為這樣的寫法一樣可以跑出結果到終端機, 想請問是否一定要用到初始為None的概念?!
class File:
def __init__(self,name):
self.name=name
def open(self):
return open(self.name, mode="r", encoding="utf-8")
def read(self):
return q.read()
f=File("data.txt")
q=f.open()
w=f.read()
print(w)
另外我對我的 code的理解是程序先跑f.open帶入q, 所以f.read可以讀得到q為f.open(即open(self.name, mode="r", encoding="utf-8"))
因此文字檔案物件的讀取w=f.read()為後面程序才開始跑, 所以可以成立, 我這樣的理解對嗎?
感謝老師撥冗回覆!
你的寫法也沒問題,沒有非得要初始為 None。至於到底怎麼寫比較好,要把這樣的包裝放到更大的需求中去看,自然就會有答案。
實體方法=在Class下的Function,self是class本身物件屬性的變數,要讓Class下的self生命週期為全域,可以想成實體方法一定要傳入Class本身的self變數
通常Function的()裡是傳入變數,變數的生命週期只在該Function裡面,不然呼叫實體方法會沒辦法傳遞self的實體屬性
以上是我的理解
很棒的理解,感謝你的分享 :)
老師您好:
首先先謝謝老師所提供的Python教學影片,看完之後,對於Python有基本的認識
由於想更進階的學習Python,想請問一下老師,我在Udemy上也有看到老師您的課程,那些課程會是youtube的進階版嗎?或是請問老師,有推薦哪些其他資源能夠讓我們有更多練習,或學習更多Python知識呢?
謝謝老師~~~ : )
Udemy 上的課程其實會和 TH-cam 重複,所以基本上是給大家自願贊助,或者喜歡 Udemy 專業的平台,包括問答等資料都會比較詳細。
我自己可能寫程式太久了,其實學習上不太看別人的教學,主要都是從官方的文件中學習,所以說到資源的部份可能沒有太多能分享的,就以下官方的文件連結嘍:
docs.python.org/3/
老師你好
最後一段我用以下函式 也可以達成目的
def name(dataname) :
with open(dataname, mode=("r"), encoding="utf-8") as file :
a=file.read()
print(a)
#name(想開啟的檔案名)
name("taxt.txt")
name("data.txt")
為甚麼要使用實體物件呢
這裡是一個學習。確實,很多程式完全不需要用到實體物件的概念就能完成。
程式的複雜度要再提升的多一點,實體物件的用處才有辦法彰顯出來,但這就不適合新手學習了 ~
其實你的想法很好! 因為一個檔案一次只能被一個程式(或client)開啟,new 很多 object 的話那些 object 有可能會衝突。
所以應該實作成 class 中有一個 static 方法可以開檔,且整個系統中只有一個該 class 的 object。(如果想像成程式端存取資料庫會更好懂)
這些技術一言難盡,但是這部影片只是引導初學者學習 function 而已,你學到更進階的語法時就可以嘗試看看囉~
有興趣可以參考 Design pattern 的 Singleton >> skyyen999.gitbooks.io/-study-design-pattern-in-java/content/singleton.html。
敢問 在python 裡如何將程式儲存? 早期basic 直譯 interpreter 是用save as filen-ame.bas and load file-name.bas into basic system and then to running in the system。
請問為什麼要寫這一段 self.file=None # 尚未開啟檔案: 初期是 None
或是說要怎麼解釋這一段的存在
程式小白感謝彭彭老師的影片,真是受益匪淺:D
我剛看完影片,也很疑惑self.file=None的意義,有沒有寫這行好像都沒影響? 如果你有甚麼理解,希望能分享一下~
給個初始值表示有個欄位在那邊,但是暫時是空白的意思而已,確實在這個範例中沒有做這件事情也不影響 ~
@@tree19900831
我的理解這更多是一個寫程式上的習慣吧
比如說寫程式在給 class/變數/屬性/方法/函數 起名稱都要要習慣起一個有意義的名稱,就像「file」這個屬性的名稱,你把它改成任何別的名稱「abc」「aa」「pangpang」電腦都能跑,可是程式不只是寫給電腦跑,更重要是寫給我們人看的,所以才要給屬性一個有意義的名稱,不然你寫了10個class以後,回頭看你第一個寫的class,屬性的名稱全是「aa」「bb」「abc」什麼的,這樣寫的程式要花很久時間才能看懂🤣
self.file=None的意義就在寫一個class的時候,先把這個class所有的屬性都列出來和給一個預設的值
老師請問一個問題。
這裏的檔案開啟後不需要 close 嗎?
有 close 更好,沒有 close 程式只要正常結束,也會自動 close
問一下老師
實例屬性 (instance attribute) 和 類別屬性 (class attribute)
最太差別就是會否共享和彈性?
實例屬性是跟著創造出來的物件實例,而類別屬性跟著類別定義本身而存在。
謝謝老師^^ 學到很多東西
太好了 ^^
感謝老師細心講解!!
不會,也謝謝你的回饋 :)
講師你好:
我想請教一個蠢問題,
python中print()的方法聲明為
# module builtins
def print(self, *args, sep=' ', end='
', file=None)
python官網的Built-in Functions函式聲明
print(*objects, sep=' ', end='
', file=sys.stdout, flush=False)
在builtins module中,print第一個參數是self,由此我認為print是一個實例方法
實例方法的調用(invoke) 應該是 物件.print(arguments)這樣使用,
但一般情況都是以呼叫(call) print(arguments)函式的形式 如: print("hello"),
並沒有由物件去調用實例方法,還是我的理解是錯誤的,
print()是函式(function) 而不是類的一個實例方法(instance method)
若不是一個實例方法,參數聲明中為何又可以使用self ?
內建函式的完整寫法是:
import builtins
builtins.print("Hello world")
要先 import builtins 這個物件,然後調用其中的方法,你可以試試看這個寫法,一樣可以運作。
但內建函式通常是經常被使用的函式,為了讓開發者方便,所以可以不需要這麼麻煩,Python 會自動載入,寫程式的時候直接寫函式名稱來調用就好。
@@cwpeng-course
講師你好:
import builtins # 匯入builtins module
這個敘述可加可不加,python解釋器執行時,會建立名為__builtins__的模組(意思是建立模組物件嗎?)
此模組包含內建函式、內建類。此模組帶有一命名空間,稱為內建命名空間(builtin name space)
我原先認為以 模組名.函式() 的形式調用函式,是因為命名空間的調用規則與物件無關,會有類似linker之類的東西進來幫忙,
重新編輯文件並加載文件中所用到的其他模組的變數、函數、類,而import語句是告知linker去哪些module找。
import math # 匯入math module
會在主程式的全域命名空間中建立 math變量 其存儲參照(reference)指向 module 'math'物件
以調用math.函數名(arguments) 為例,解釋調用math module物件的某一函數:
1) 先在主程式的全域命名空間內尋找math變數,該引用指向module 'math'模組物件
2) 在math module模組物件的全域命名空間中尋找要調用的函式
3) 建立函式區域命名空間,為函式中的參數賦值,並自上而下執行函式體中的步驟
請問觀念是否正確?
老師你好!想問一下,如果在open(self)的實體方法中使用with open的方式開始檔案,並將其賦值到特定變數上,是不是就不用在__init__這一層設定self.file=None的global variable?另外想請教,self.file算是global variable嗎?還是在class的角度上,算是local variable?
self.file 是物件的屬性,不會用 variable 的方式看待,他是跟在物件底下的。所以你的前一個問題,當然不一定要寫在 self.file 之下,但如果你希望能夠透過物件來取得這個屬性,就必須這樣處理。
老師你好 如果我想在class裡面再新增一個寫入的函數 是不是就必須再定義一個mode="w"的函式進去 像下面的一樣
def openwrite(self):
self.file = open(self.name, mode = "w", encoding = "utf-8")
def write(self, letter):
return self.file.write(letter)
還是會有其他的方法呢 ?
你可以用 mode="r+" 那就可以寫入也可以讀取。
你定義一個 write 方法沒有問題,不一定需要寫 return 就是了 :)
至於是否有其他方法?有哦,有百百種,但重點是你的方法能夠按照你想要的方式運作就可以 ~
想請問如果是這樣開啟檔案 還需要在把檔案關起來嗎?
理想上是要的,但沒有做關閉,在簡單的程式中其實感覺不出差異 ~
This is amazing. Great lecture. I am so lucky to see these video. :)
Thanks for your support. :)
def open(self):
self.start=open(self.name,mode="r",encoding="utf-8")
老師您好,請問檔案路徑這邊為甚麼是self.name呢?
記得老師之前的影片說過,檔案路徑可以用檔案名稱來設定,請問除了檔案名稱以外,還可以用甚麼資料來設定檔案路徑呢? 謝謝~
取得實體物件的 name 屬性,self 代表實體物件本身。檔案路徑本身應該包含檔案所在的資料夾,只寫檔案名稱是因為要讀取的檔案和程式檔案放在同一個資料夾所以可以忽略資料夾的部份。
@@cwpeng-course 老師解釋得太清楚了~~~ 謝謝彭彭老師😭
老師教的超好 淺顯易懂 希望能固定出教學影片 最後再教一些簡易實用的應用程式製作...
謝謝你的回饋,我盡量嘍 :)
謝謝老師
老師您好:
請問初始化的def 裡面是在運作甚麼?
還有甚麼時候該用回傳值?
為我才國一所以有些不懂
謝謝老師
這是很長的一段教學內容,可能要往前找找基礎的影片哦,有一隻是關於函式的教學 :)
@@cwpeng-course 好的 謝謝老師
老師請問一下你在類別裡用open的方式打開檔案,可以不需要自己寫關閉檔案嗎? 還有可以在類別裡用with的方式開檔嗎?
可以哦。
一般不自己關閉檔案,程式結束的時候就會自動關閉。
程式新手在這邊想請教一下,這邊有用到將檔案打開跟讀取,可是沒有把開啟的檔案關掉對不對?
是的,很好的觀察。不過只要程式結束,打開的檔案會自動關閉 ~
感謝彭彭老師的教學。請教老師,如果想要將 print(data) 一併寫入 read(self)函式中,不想每次呼叫類別時再寫一次,請問該如何處理? 謝謝您。
就直接把 print 寫在 read(self) 的函式中即可 ~
@@cwpeng-course 想通了,感謝老師的指導 !!
有辦法用for迴圈寫出連續讀取檔案的方式嗎?
可以哦
老師您好:
想要請問一下這邊的寫法是 open 以及 read 並不是with open as的寫法,那這樣的話為甚麼不需要close檔案呢,希望老師幫我解答一下,謝謝老師
with open as 是比較好的寫法,我這邊算是偷懶。
好的程式確實是需要 close 的,不過簡單的練習程式,只要程式執行結束,也會自然 close 掉檔案 ~~~
@@cwpeng-course 謝謝老師
@@cwpeng-course 老師好,我有疑問,既然您說""只要程式執行結束,也會自然 close 掉檔案"",那為何正式的程式碼最後要寫 f.close()? 這不是矛盾嗎?
有一個小小疑問是老師在定義實體方法時,名稱取為open、read 這類python內建的函式名稱,這樣在程式運作中電腦有辦法判斷是在執行實體方法還是內建的函式嗎?
謝謝老師~
實體方法會明確的先產生物件,然後再利用:物件.實體方法名稱() 這樣的方式進行呼叫,所以不會有混淆的問題哦 ~
老師很厲害,學了很多,接下來還有python的影片嗎? 想學更多QQ
謝謝哦 :)
會有的,基本上持續更新,只是頻率可能不太一定就是 ~~~
請問老師:
實體物件的下的初始化是沒有回傳的嗎? 類似這樣
def __init__(self):
return
只能另外寫一個def 做回傳?
初始化確實是不需要回傳的,他會直接產生一個新的實體物件 ~
請教老師,如果是在class裡面放入module是甚麼意思呢? 例如:
class cmd(pexpect.spawn):
def __init__ (self):
pexpect.spawn.__init__(self, None)
繼承的意思,這部份我的教學裡還沒有涵蓋到。
你可以在網路上搜尋看看 Python 的類別繼承 ~
真是太好了,我有找到一些文章,謝謝老師!
彭彭老師好,想問說 def __init__(self, name) 的括號裡面沒有寫 file ,是因為下面的實體屬性 self.file 一開始定義是 None ,所以可以不用寫出來嗎? (如果寫成def __init__(self, name, file),後面的 f1=File("data1.txt") 就要寫成 f1=File("data1.txt", "None"),不知道這樣理解對不對)
對呦,你的說明蠻好的呀 :)
@@cwpeng-course 謝謝老師的回覆,老師教得很棒,大推!
請問老師後續會有繼承,多型 這些的影片嗎
我會考慮放到進階的教學裡面,謝謝你的建議 :)
老師好,關於open 那邊沒有close 是否自己多加一個close 的實體方法會比較好?
可以哦,多加一個 close 的實體方法確實比較完整 :)
謝謝彭彭老師
:)))))))
這樣的寫法是不是有寫問題?
open後沒有class
在這個範例中 只有一個讀取的動作 那直接用with語法套一個讀取的動作會更好吧?
感謝分享,確實有很多更好的寫法。不過一次談一個主題,新手比較不會太混亂。
@@cwpeng-course owo 沒想到還能收的到回覆
我當初 open 跟 with是一起學的 沒想到這一碴
老師,請問一下為甚麼18:10那
return self.file.read 就好呢?
不需要開啟檔案嗎?
不需要關閉檔案嗎?
前面的操作已經開啟過了哦 ~
老師想請問在同一介面中,兩個變數都叫data,為何不會造成資料讀取失敗呢~?
程式是按照順序思考和執行的,第一次讀取會把資料存放進 data,這時 data 是第一次讀取的資料。第二次讀取會有新的資料存放進 data,這時 data 是新的資料,覆蓋舊的資料。
老師你好:
想請問在第一段內容中,如果我把targerX和targerY換成別的代號,是不是就要在前面的初始化函式中就先定義兩個代號?
但如果這樣,為什麼targetX和targetY不用先定義就可直接帶入了呢?
那個是函式參數的概念,和物件本身沒有太大關係哦 ~
請問 24:34 f1= file("data1.txt") 是因為data1是已經存在的檔案 所以直接加在類別名稱後面這樣用嗎?
是已經存在的檔案名稱,用來做實體物件的初始化,我們會把這個名稱紀錄在實體物件的 name 屬性裡面 ~
請問彭彭老師,在13:14 return 改成 print ,然後在13行,刪除result 和 14行刪除,結果是一樣的嗎
是哦,結果會是一樣的
老師你好
我練習打完程式
class Point:
def _init_(self,x,y):
self.x=x
self.y=y
def show(self):
print(self.x,self.y)
def distance(self,targetX,targetY):
return (((self.x-targetX)**2)+((self.y-targetY)**2))**0.5
p=Point(3,4)
p.show()
result=p.distance(0,0)
print(result)
按下執行之後跑出下面的問題,
D:\python-training>python instance.py
Traceback (most recent call last):
File "instance.py", line 10, in
p=Point(3,4)
TypeError: Point() takes no arguments
確認過每一行和練習的都一樣,這個可能是甚麼原因?
第一個初始化函式前後都有兩條底線哦 def __init__(self, x, y): 這樣
老師 我想問一下 下面的Error該如何解決 從class File往下的code都是照著老師一樣寫的;
Traceback (most recent call last):
File "instance.py", line 47, in
f1.open()
AttributeError: 'File' object has no attribute 'open'
可能還是要看看你寫的程式碼,來確認問題哦 ~
目前在學校做NLP相關專題 因為會用到python 也推薦組員們一起來這學習
感謝推薦 ~~~
不客氣!!!
老師您好想跟老師請教
請問之前教到的類別的屬性與實體屬性與實體方法的差異是什麼呢
是差在實體方法會有一個物件的引數嗎
此外還想請問 __init__是否能看作類別的一個屬性呢?
謝謝老師那麼用心教學!🙏
實體屬性是任何非函式的資料,實體方法其實就是綁在物件中的函式。
__init__ 我們比較會說是類別的初始化方法。
請問一下,在最後初始化函式中,self.name=name和self.file=None有意義嗎?因為在之後的過程中好像用不到啊?
在 open 和 read 的方法中,都有繼續使用 self.name 和 self.file 哦。
@@cwpeng-course 但是self.file=None的意義在哪? 我刪掉此行,也照樣可以跑檔案出來>_
@alemapnil L
self.file 也可用在 read() 裡檢查 user 是否已呼叫 open() 再呼叫 read():
def read(self):
if self.file != None:
return self.file.read()
else:
print("Please call open() first")
老師只是為求易懂簡化寫法,沒特別寫這麼細而已
想請教老師一個小問題
class File:
#初始化函式
def __init__(self, name):
self.name=name
self.file=None #尚未開啟檔案: 初期是None
#實體方法
def open(self):
self.file=open(self.name, mode="r", encoding="utf-8")
def read(self):
return self.file.read()
#讀取第一個檔案
f1=File("data1.txt")
f1.open()
data=f1.read()
print(data)
但我的終端機上寫
Traceback (most recent call last):
File "D:\python-training\instance.py", line 41, in
class File:
File "D:\python-training\instance.py", line 52, in File
f1=File("data1.txt")
^^^^
NameError: name 'File' is not defined. Did you mean: 'False'?
是什麼意思?
想問在class File中, 爲什麽我不可以用前面教過的with open... as file (有error)? 還有想問一下open file 之後該如何close file? 謝謝指教
如果是搭配這邊的程式,就另外寫一個方法叫做 close,然後把 self.file.close() 這個命令包進去就可以了。
with open 這個會在區塊中直接打開並關閉,所以沒辦法把動作分開處理 ~
關於#point實體物件的設計,平面座標上的點
class Point:
def __init__(self,x,y):
self.x=x
self.y=y
def show(self):
print(self.x,self.y)
def distance(self,targetx,targety):
return(((self.x-targetx)**2+((self.y-targety)**2))**0.5)
p=Point(3,4)
p.show()
p.distance(0,0)
請問為何第二個定義實體方法是使用return而不是跟第一個def show下面一樣使用print呢?
即使看過前面影片還是不太確定這邊return回傳的使用時機及用意,問題有點抽象,先謝謝解答!
使用 print 就會直接印出東西。使用 return 就是函式回傳的概念,資料會被回傳到呼叫函式的位置,在這個例子中就是 p.distance(0,0)。不同的運作工具,視情況使用而已。
如果單純印出來 可以直接用print
如果計算出來的結果有需要留下來要用return
7:20 那個this.我笑出來,老師很可愛ha
XDDDD
老師您好:
我一開始按照您的方式撰寫
#File 實體物件的設計: 包裝檔案讀取的程式
class File:
def __init__(self,name):
self.name=name
self.file=None #尚未開啟檔案:初期是None
def open (self):
self.file=open(self.name, mode="r",encoding="utf-8")
def red(self):
return self.file.read()
#讀取第一個檔案
f1=File("data1.txt")
f1.open()
data=f1.read()
print(data)
但是出現
Traceback (most recent call last):
File "D:\old\python-training\instance-2.py", line 28, in
data=f1.read()
^^^^^^^
AttributeError: 'File' object has no attribute 'read'. Did you mean: 'red'?
後來我把read改成red就成功讀取
想請問為甚麼會這樣?
謝謝老師
有沒有一種可能,你定義class的時候把read打成red,所以當然沒有read這個method,只有red(請回去重看你的class definition)
因為你定義的函式名稱就叫做 red,f1.red() 是要對應到你自己在 class 中寫的函式名稱。
@@cwpeng-course 真的ㄟ~哈哈
眼睛有問題~
謝謝老師
請問影片20:25這裡我的顯示
PS D:\python-training> & "C:/Users/Lin Hung Yu/AppData/Local/Programs/Python/Python38-32/python.exe" d:/python-training/TH-cam/instance.py
Traceback (most recent call last):
File "d:/python-training/TH-cam/instance.py", line 53, in
f1.open()
File "d:/python-training/TH-cam/instance.py", line 48, in open
self.file=open(self.name,mode="r",encoding="utf-8")
FileNotFoundError: [Errno 2] No such file or directory: 'data1.txt'
之前影片介紹modules時也有類似問題,跪求解答
FileNotFoundError: [Errno 2] No such file or directory: 'data1.txt'
你根本沒有data1.txt這個檔案
感謝 @nice guy 的回應 :)
程式找不到你的文字檔哦,確認一下文字檔的檔名和所在的資料夾位置 ~
老師好,因為我是先學swift的,我想請問,在swift裡面也有類似「封包」這樣的東西或是概念嗎?感覺看到這一課,大部分swift的語言都有相對應的,但是封包好像沒有?另外想問,如果要繼續學多一點python,應該要看哪些書籍或是?
我完全沒碰過 swift,所以無法回答關於 swift 的問題嘍 @@
任何你能夠看下去不會睡著的書籍,或者是透過官方的學習文件 docs.python.org/3/tutorial/index.html
請問彭彭老師,我執行之後終端機告訴我no such file or dictionary: data1.txt,可是我的確已經建立了一個名叫data1.txt的檔案,請問可能是為什麼呢?(都跟老師打的一樣)
可能性很多,要看你的專案資料夾結構,執行程式的方式和完整的程式,比較有機會找到問題點嘍 ~
老師您好,想問一下,在open函式裡面用utf-8編碼的意義是什麼?
為什麼我一開始有加入encoding="utf-8" 顯示出
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xab in position 0: invalid start byte
後來刪掉之後就可以正常顯示"哈哈"兩個字?
要看我們要打開的文字檔案,是否用 utf-8 編碼存檔。
因為大多數時候,預設是 utf-8,所以我這邊直接請大家使用 utf-8 編碼來處理。
你的狀況可能是文字檔案本身在編輯和存檔時是使用 big5,所以會對不上。
@@cwpeng-course 感謝老師~~太神啦
想請問一下 21行self.file=None
這行如果沒加會在甚麼情況下出錯嗎
或是效能上考量等等的
因為就算一開始沒有新建self.file並賦予None值
在第24行self.file=open(self.name, mode="r", encoding="utf-8")這段
這邊也會新增self.file來使用
沒有特別的考量,只是給予一個初始化的資料,保持某種一致性而已 :)
非常容易理解
太好了 ~~~~~
老師想請問,
可以用def write(self):
來寫入檔案嗎,若可以的話那實際操作大概是甚麼,謝謝老師
可以呀,就我們的函式應該還是需要接受一個要寫入的內容當參數,例如:
def write(self, content):
self.file.write(content)
純補充:open 裡記得要能寫入 (mode="r+")
彭彭老師好,
想請問在完全按照老師的code編寫後
(除了所讀取的文件名稱是自己隨意取的,但code也有更換為自己定義的文件名稱),
終端機仍然給我一個
'builitin_function_or_method' object has no attribute 'file'
我找不到問題所在...請老師救救我
不好意思,剛留言就看到我錯植的地方XD
問題已解決!
謝謝老師的無私教學~~
好哦,有解決就好了 :)
请问一下,这直接把数字代入然后印出结果的就用print ,要经过公式运算后再印出结果的就用return吗?
在我们的示例中是的,不过 return 的概念就只是把资料从函式中回传出来而已。
感謝老師指導,請問如果課程都已經操作過後,接下來有什麼建議可以精進自己的?
你可以往:網頁爬蟲、資料分析、介面設計、伺服器開發等領域去找一些教學。
這些領域我目前還沒有在 TH-cam 上提供影片嘍 ~
@@cwpeng-course 老師好,我想之後向資料分析發展,不知道您有什麼推薦的書籍或者教學影片,在線課程嗎?太感謝您了!
老師想請問一下跑這行
def open(self):
self.file=open(self.name,mode='r',encoding='utf-8')
出現了invalid character in identifier
不知道為什麼無效....QQ
可以先仔細看看錯誤訊息中,是否有指出錯誤在哪一行,可能也不一定是在你說的這行哦 ~
或者是你可以重新打看看,可能不小心參雜了一些看不見的字元在裡面 ~
@@cwpeng-course 有~重打後就ok了,謝謝老師耐心回復!
老師你好,如果想要改掉data內的資料,這樣寫可以成功執行,想請問這樣寫的邏輯是對的嗎?
class File:
def __init__(self, name, file):
self.name=name
self.file=None # 尚未開啟檔案: 初期是None
def open(self):
with open(self.name, "r", encoding="utf-8") as self.file:
return self.file.read()
def write(self):
with open(self.name, "w", encoding="utf-8") as self.file:
self.file.write("我是立哲
哈哈哈")
f1=File("data2.txt","None") # 讀取第一個檔案
f1.write()
data=f1.open()
print(data)
可以執行就沒問題哦,只是你設計的程式在邏輯上有點重複,沒有特別的乾淨俐落 ~
想請問老師 如果用此方法是不是不會自動關閉檔案
對哦,不會自動關閉,不過程式如果結束,檔案還是會關閉的 ~
@@cwpeng-course 老師請問如果要釋放資源的話 以您的例子會建議怎麼寫
今天一覺醒來發現所有python 的檔案都顯示 "No such file or directory" , 能告訴我如何解決嗎?
可能在執行程式前,沒有先用 VS Code 打開專案資料夾哦 ~~
彭老師你好,在我寫到f1=file("data1.txt")的時候出現Undefined variable 'file'pylint(undefined-variable)這個問題。請問如何解決呢?謝謝
忘了說在file底下出現紅線, 還有我給class取的名也叫file, 為什麼會報錯呢?
確認大小寫都沒問題,且程式可以正常執行的話,可以忽略 pylint 給的錯誤。
你的編輯器中安裝了 pylint 這個擴充套件,會偵測錯誤,但不一定總是正確的。
請問一下老師,為甚麼我執行會出現無法解碼的訊息UnicodeDecodeError: 'utf-8' codec can't decode byte 0xab in position 0: invalid start byte,有用之前的方法利用寫入檔案的程式碼再進行讀取就沒這個問題,而直接建立文字檔案寫中文就會出現錯誤
可能是文字檔本身的編碼沒有使用 utf-8,用 vs code 打開文字檔,看看視窗下方有沒有編碼的資訊,換成 utf-8 後再試試看 ~
老師好 ! 感謝老師的教學影片,不知不覺中,也多多少少懂了一些 ! 但是關於這影片中,有一個問題想請教一下 . . .
就是為什麼在"初始化"期間(第19行程式碼中) , 為什麼括號裡面不新增一個叫做"file" 參數,而是在第21行才定義?
我嘗試自行寫一遍這程式時,發現我會在"初始化"時,在括號內就定義,但會跳出
"TypeError: __init__() missing 1 required positional argument: 'file' "
的錯誤訊息 ! 先感謝老師的說明 !!!
你要在括號裡定義參數名稱,在後面建立的時候就要傳遞參數的資料,他們是對應的,如果沒有做相對的處理,就會出現你提到的這個錯誤訊息。
我設計上沒有在初始化的時候給定檔案,後續透過其他方法來建立檔案物件,這只是設計的不同。若想要做不同的程式結構設計,就必須要在每個細節都搭上才行。
@@cwpeng-course 謝謝老師的說明 ! 很高興還能得到老師的回覆訊息 !
想請問老師,都跟著影片程式碼編寫但都會出現NoneType' object has no attribute 'read , 找不到為什麼..
得把程式碼貼出來看看哦 ~
想請問老師如果想操作變數的迴圈有什麼方法嗎?像是這邊如果想做for s1~s10(或是sn,n是任意數)的update迴圈,應該要怎麼寫呢?還是這些用變數存放的資料沒辦法直接透過迴圈處理,沒有在網路上找到答案,麻煩老師了!
class DB:
def __init__(self,SID,name,major):
self.SID=SID
self.name=name
self.major=major
s1=DB(55667788,"Amber","IFMG")
s2=DB(55443322,"Plack","ASIS")
database={s1.SID:s1.name+"/"+s1.major}
database.update({s2.SID:s2.name+"/"+s2.major})
def dbsearch(SID):
if SID in database:
print(database[SID])
else:
print("Data Not Recorded")
試著把你的變數放進列表裡,就可以寫成迴圈了。
例如:
list=[s1, s2]
for s in list:
對列表中的每個 s 工作
想問一下用實體方法打開的檔案需要關閉嗎,還是要在裡面多寫一個關閉的指令?
理想上是需要關閉的,可以多寫一個關閉的指令即可。
想問彭彭老師
def open(self):
self.file=open(self.name, mode="r+", encoding="utf-8")
def write(self,msg):
self.file.write(msg)
self.file.close()
def read(self):
return self.file.read()
f1=File("data1.txt")
f1.open()
data=f1.write("為什麼沒辦法完全取代")
f1.open()
data=f1.read()
print(data) #結果為(為什麼沒辦法完全取代)
為什麼使用write沒辦法像之前用with open一樣整串文字取代
我如果改成 data=f1.write("第二串文字")
print出來的結果會變成"第二串文字法完全取代"
程式只會去改寫前面的字元不會整串更改
mode="w" 才會整個檔案清空重寫,若是 mode="r+" 不會清空檔案資料,就會是你看到的狀況。你可以用 mode="w+" 試試看。
初始化函示中:self.file=None 取代為 self.file=open(self.name, ......),就可以省去 def open(self)那段,後面讀取檔案也省下f1.open()
請教這樣是可以的嗎?我試的結果是可行,但怕就剛好可以而已XD
+1 我也是亂試試出來這樣
可以哦,沒什麼問題 :)