写作绅士,读作丧尸 X岛揭示板
顺猴者昌 逆猴者亡 首页版规 |用户系统 |移动客户端下载 | 丧尸路标 | | 常用图串及路标 | 请关注 官方公众号:【X岛揭示板】 官方微博: 【@X岛极速版】| 人,是会思考的芦苇
常用串:·豆知识·跑团板聊天室·公告汇总串·X岛路标

No.62474737 - 无标题 - 技术宅


回应模式
No.62474737
名 称
E-mail
标题
颜文字
正文
附加图片
•程序语言、压制投稿、视频制作以及各计算机领域的技术问题
•我觉得还是CSDN靠谱一点
•本版发文间隔为15秒。

收起 查看大图 向左旋转 向右旋转
无标题 无名氏 2024-05-22(三)00:09:43 ID:ZNSiC4R [举报] [订阅] [只看PO] No.62474737 [回应] 管理
從哪個角度比較容易搞懂Python的Class?
小肥到現在還是用def來寫python的工具,但是前輩們丟出的代碼都是用物件導向寫的
因此萌生想了解Class的思路
資源的話小肥自己會找,之前也有上過相關的網課
但是怎麼看跟練習都不是很懂的透徹
請問肥哥們是從哪個角度去理解Class的呢?
JP
收起 查看大图 向左旋转 向右旋转
无标题 无名氏 2024-05-22(三)00:47:12 ID:OX2B1Pi [举报] No.62475231 管理
不太清楚肥哥对Python本身及其面向对象编程的理解到了哪种程度,而且我本人是学C#的,总之我尽力回答( ゚∀。)

以概念去描述的话,class,类,其自身是一个空的待定义的容器,你可以向这个容器中放入变量,或者是方法,或者是别的什么东西。此时类就变成了承载了数据的有定义的概念,换句话说就是模板,然后就可以通过这个概念实例化出具体的对象,然后去操作对象,这就是面向对象编程了。

举例的话,首先我们命名了一个类Cat,此时类是空的,只能从名字上窥见开发人员想将这个类作为猫模板来使用,那么为了达成这一目的,就需要向类中添加猫该有的变量或方法,比如体重,以及叫这一动作。
然后,在别处,我们需要一个猫来叫唤几声,那么就通过这个类来生成这个实例,比如说几把猫,然后这个几把猫才是我们实际操作的对象,调用方法 几把猫.叫唤() 才是我们需要的(`・ω・)
收起 查看大图 向左旋转 向右旋转
无标题 无名氏 2024-05-22(三)01:02:11 ID:OX2B1Pi [举报] No.62475372 管理
然后这其实只是举例,在实际运用的过程中,类的运用往往会抽象很多(`・ω・)

这里我斗胆猜测一下肥哥目前的Python使用进度,应该还停留在“出现问题→新建py文件→编写方法→执行脚本”这一步骤?
那我可以大胆地告诉你,你所创建的py文件实际上就是一个类,执行脚本实际上就是执行了类中的直接运行的代码,随后输出结果到控制台或是别的指定输出位置。
你可以将脚本文件中那些直接运行的代码行也放到方法中,然后给整个文件加上缩进与类的定义符,这时候一个属于你自己的类就创建出来啦!

对类的理解不深可能也是因为Python中直接编写可运行脚本这种方法已经足够应付大部分情况,所以类使用得比较少,因此认识不深
收起 查看大图 向左旋转 向右旋转
无标题 无名氏 2024-05-22(三)01:18:12 ID:OX2B1Pi [举报] No.62475492 管理
然后得益于Python的易用性,我发现我很难讲清楚class是个什么,虽然看上去打了几大段文字,但是感觉在说囫囵话,不晓得肥哥能不能懂( ゚∀。)

总之接下来再试试混合教学的方法( ゚∀。)


在C#学习中,我们面对的不是一个简单的,可以直接写下代码并运行的界面,而是一个程序入口类Program,以及一个主方法,但我忘记叫什么了,总之暂定为Init吧

在最初的学习当中,都是直接在这个Init中编写代码,随后直接运行,此阶段跟Python基本相同

随后开始学习怎么写方法,也可以叫它函数,总之就是Python中的def,与Python不同的是,我们的C#方法不能写在这个Init主方法之中,那么写在哪里呢?答案是Program类下,然后在Init主方法调用

再下一个阶段,我们需要做一些实际的东西出来了,比如说最常见的,统计学生的姓名班级年龄并逐个输出,我们当然可以选择在主函数内创建几个列表分别存储这几个数据,然后按索引遍历输出,但更聪明的方法是,我们将同属于一个学生的信息存储在学生自身身上,并让学生“自己报出自己的信息”,此时我们就需要写下一个类Student,它与Program类同级,这个类内包括了姓名班级年龄等变量,以及一个方法,方法功能是在屏幕上输出自己这几个变量的值。随后在主方法上实例化每个学生,并在实例化的时候给出给每个变量具体复制,然后调用实例的方法即可(`・ω・)

再下一个阶段,就是正经开始解决问题了,这时候你会发现自己需要非常多的方法,需要在非常多的地方存储或传输数据,你需要一个地方将同类的,或者应该放在一起的方法及数据放在一起,那也是类的功能,此时类就开始五花八门了起来,比如说数学类Math,甚至是角色管理器类CharacterManager等等(`・ω・)
收起 查看大图 向左旋转 向右旋转
无标题 无名氏 2024-05-22(三)01:21:47 ID:OX2B1Pi [举报] No.62475523 管理
然后我感觉我讲得还是有点杂七杂八的( ゚∀。)
总之Python类实在难以理解的话可以看看别的,比如C#,虽然后者也经过了高度的简化以方便非计算机人员学习,但是比Python要……想不出更好的形容词……更有条理一些吧,或者说更符合程序规律?

总之我觉得我全篇最能概括的一句就是“简单理解的话,每个单个的py文件其实就是一个类”( ゚∀。)
无标题 无名氏 2024-05-22(三)02:12:23 ID:QbwxZDS [举报] No.62475835 管理
py更倾向于脚本吧,跟c#的类在运作还是有些出入的
主方法是main( ゚∀。)7
类就是一个有数据(称为属性)和行为(称为方法)的独立的概念,例如猫,狗,动物,植物这些。属性和方法相互作用,相互统一。
而类只是一个概念,如果要使用它需要有一个实例。例如肥肥这个类,他可能有实例OX2,ZNS等等,里面有如饼干这样的属性和如回复这样的方法
无标题 无名氏 2024-05-22(三)08:38:57 ID:NBzHhWQ [举报] No.62476749 管理
写个小游戏/gui程序?
无标题 无名氏 2024-05-22(三)08:41:39 ID:Rrfm4tk [举报] No.62476771 管理
(´゚Д゚`)bbb
无标题 无名氏 2024-05-22(三)09:29:42 ID:XQrJvuq [举报] No.62477179 管理
(´゚Д゚`)
收起 查看大图 向左旋转 向右旋转
无标题 无名氏 2024-05-22(三)11:45:09 ID:ZNSiC4R (PO主) [举报] No.62478550 管理
>>No.62475231
謝謝肥哥的解釋,我嘗試著一邊翻書一邊理解快多了
我的理解如下:
總之來說,class剛定義的時候只是一個記憶體的位置
要往裡面添磚加瓦,class才會漸漸有實質上的意義,也就是您說的模板
當實體化(這裡不是呼叫)一個class的時候,就創造出了一個物件,對此再添磚加瓦就是物件導向的程式了

>>No.62475372
對,我就是因為範例與實際比起來實際操作太過抽象所以會很頭痛(つд⊂)
不愧是肥哥,我的確是使用單一腳本來編寫流程後執行,因為只要能滿足需求就可以交差了(つд`゚)

原來py文件也是一個類呀……難怪小肥發現文件檔名跟import的模組相同時會輸出錯誤( ゚∀。)
這下是python搞不懂該呼叫自己本身還是去找同名的模組去了
將腳本拆開成幾個py檔最近有實做過,不過就只是把def的函式抽出到其他文件,然後當成moudle import進來,原來這樣就是新增了類嗎
但是肥哥說的把文件加上類定義我可能要再多看看人家寫好的代碼,因為真的如肥哥所說,類使用的太少了所以認識不深……

>>No.62475492
不不不,肥哥已經講解得很清楚了
小肥學過點C,所以肥哥這裡的講解我多少能體會了
在學生的範例中我大概可以理解,如果把學生的資料都用Dict或是List的資料類型儲存起來的話,之後要管理會非常蛋疼
但是如果把學生變成類,那更新或是提取資料會變得相當的容易,因為不再是資料類型,而是一個實體化後的物件
而物件操作比一堆資料操作會簡便許多……吧( ゚∀。)

>>No.62475523
我個人會覺得Python是方便入門的,雖然小肥會的並不多
謝謝肥哥最後的總結,一句話點醒迷糊小肥
感謝肥哥( ˇωˇ)人
收起 查看大图 向左旋转 向右旋转
无标题 无名氏 2024-05-22(三)12:02:13 ID:ZNSiC4R (PO主) [举报] No.62478724 管理
>>No.62475835
朋友有跟小肥說只要會用main就已經很厲害了(つд⊂)

所以肥哥的意思是物件導向的程式是建構在實體化的類上面
類需要添磚加瓦,加入屬性跟方法,難怪當時網課的時候老師會花很多時間講UML
因為類的屬性跟方法沒有先定義好的話,造出來的肥肥這個類可能在實體化的時候會對流程影響很大……吧( ゚∀。)7
也感謝肥哥的闡釋( ˇωˇ)人

>>No.62476749
之後會需要碰FastAPI的項目,到時候也逃不了類的摧殘的
……還有踏馬的裝飾子口牙(╬゚д゚)

非常感謝肥哥們的回覆( `д´)7
收起 查看大图 向左旋转 向右旋转
无标题 无名氏 2024-05-22(三)12:39:26 ID:OX2B1Pi [举报] No.62479110 管理
>>No.62478550
總之肥哥能懂就行( ゚∀。)
以及睡醒後還想到了一個大概能幫助肥哥理解的解釋

那就是Python本身是不太強調類型這個東西的,所以說用起來非常方便,但是對類的理解會有些薄弱

舉個例子,當用上文件操作的時候,首先要獲取到這個文件對吧?通常來說用的是變量賦值或者是with語句,那麽你所獲得的file變量其實就是類的實例啦。
在Python中,直接這樣寫
myfile = 獲取文件的方法
這個代碼寫全的話,應該是
File myfile = 獲取文件的方法
File就是文件類,表明你的變量是該類的一個實例,myfile就是你的實例,你的一切實際操作都是建立在你所獲取的實例myfile上的,這樣的(`・ω・)

那麽前面提到了類是模板,實例是寫入了數據的實際物體,在上文提到的例子中,數據是在哪裏寫入的呢?答案是 獲取文件的方法 這一步。
我對Python記憶不深,但是這個方法應該要傳入文件路徑編碼方式之類的,在類的內部,有一些函數,Python中我不清楚叫什麼,但是C#中它被稱為構造函數,會在實例被創建時進行調用並完成實例的初始化,這個例子就可以理解為我向類的構造函數種提供了參數,隨後生成了類的實例。(`・ω・)

感覺又有些說多了,總之肥哥能夠理解就太好了( ゚∀。)

順便教給肥哥一個特別好的理解類的辦法,就是手動寫一個列表MyList類,並且完成列表List本身可以實現的大部分功能,我當時學C#就是這麽乾的( ゚∀。)
對的,說到這裏吐槽一句,列表其實也是個類,除了最基礎的數據類型,比如字符串,數字之類的,其他的都是類( ゚∀。)
无标题 无名氏 2024-05-22(三)13:02:37 ID:YdWBvB8 [举报] No.62479343 管理
原来那边把object oriented翻译成“物件导向“,感觉比“面向对象“这个翻译还要好|∀` )

不过python其实既不是完全面向对象也不是完全面向过程的,如果要理解透彻的话确实是参考一下完全面向过程(C)和完全面向对象(C#/java)语言比较好。

比如在C语言的字符串操作,是通过string.h下的一系列函数实现的。比如我要连接“nmb“和“xd“两个字符串,写法是这样的
char2[0,6] s1 = “nmb“;
char1[0,3] s2 = “xd“;
strcat(s1,s2);
这样s1的值就成了 “nmbxd“

但是想必po也知道了,这在python里只需要一个+号就可以了
这是因为python的str就是一个类,加法运算符实际上是调用了它的__add__方法(函数),不过python并不强制必须面向对象,于是以下三种写法结果是相同的
'nmb'+'xd'
'nmb'.__add__('xd')
str.__add__('nmb','xd') #这就是面向过程的写法

__add__方法就是python约定的用于重载加法算符的方法,因此我们自己写一个class 然后def 这个方法,就可以在自己定义的这个类上直接使用加法算符进行运算,po可以试试照着这个思路来实现一个支持基本数学算符的 分数/复数 之类的class,比如要实现分数,就需要两个字段来存储分子和分母,复数就是分别存储实部和虚部,然后分别def __add__
__sub__之类的运算符方法,这样自己实现的class也可以直接使用加减乘除符号进行数学运算,这就是类的方法表示带来的遍历,对于面向过程的情况,就没法这样实现,因为函数和数据类型不是绑定在一起的,而和一个class绑定的函数(即它的第一个参数是self)就叫做这个class的method
无标题 无名氏 2024-05-22(三)13:05:07 ID:Zpep2Hv [举报] No.62479368 管理
程式
是台湾肥(´゚Д゚`)?
无标题 无名氏 2024-05-22(三)13:05:13 ID:YdWBvB8 [举报] No.62479372 管理
>>No.62479343
草 c语言那部分数组长度变成roll点了(;´Д`)
无标题 无名氏 2024-05-23(四)08:07:26 ID:83YvGLK [举报] No.62489116 管理
>>No.62479372
正好是1和2也太巧了吧 差点以为是变量名了|∀` )
无标题 无名氏 2024-05-23(四)08:10:16 ID:OtLOykA [举报] No.62489133 管理
这个串解答了我的疑惑,不仅内容质量高,而且jp质量也高
无标题 无名氏 2024-05-28(二)13:15:46 ID:AoPz3dA [举报] No.62548906 管理
你看一下面对对象思想,面对对象编程是由面对对象思想延伸而来的编程方式。

UP主: