电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Python基于class()實現面向對象原理詳解

瀏覽:66日期:2022-08-01 09:34:02

首先,類是一個集合,包含了數據,操作描述的一個抽象集合

你可以首先只把類當做一個容器來使用

class Cycle: def __init__(self,r): self.pi=3.14 self.r=ra=Cycle(4)b=Cycle(7)

你看,我們定義了一個 Cycle 類,我們現在只是將它當做一個數據集合來用,我們利用其實例之間彼此數據隔離的特性來保證具體的實例數據彼此不污染。好了你現在想問,為什么我們要用數據集合來放數據

好了,我們來看看沒有類之前我們會怎么樣,假設我們現在要計算圓的面積

def square(r,pi): return pi * (r**2)PI=3.14a_r=4a_square=square(a_r,PI)b_r=7b_square=square(b_r,PI)

看起來沒有問題,好了,現在問題來了,假如,你現在要計算很多圓的面積,那么你是不是發現,不斷的用變量命來隔離數據方式變得越來越臟了。而且你發現是不是有很多冗余的代碼

好了我們這么改一改

class Cycle: def __init__(self,r): self.pi=3.14 self.r=rdef square(value): if not isinstance(value,Cycle): raise ValueError('value muse be Cycle instace') value.square=value.pi * (value.r**2)a=Cycle(4)b=Cycle(7)square(a)square(b)

好了,你有沒有覺得現在清晰了一點。

好了,現在我們現在還可以改一下

class Cycle: def __init__(self,r): self.pi=3.14 self.r=r def square(self,value): return self.pi * (self.r**2)

好了,現在你可能迷惑了,我們為啥要把 square 函數放在類中?

好了,我現在要計算長方形,原型,梯形各種各樣二維幾何圖形的面積,這樣該怎么寫???

你想了想我們之前說的將類作為數據容器,你想了想寫了如下的代碼

class Rectangle: def __init__(self,length,height): self.length=length self.height=heightclass Cycle: def __init__(self,r): self.pi=3.14 self.r=rdef rec_square(value): if not isinstance(value,Rectangle): raise ValueError('value muse be Rectangle instace') value.square=value.length * value.heightdef cycle_square(value): if not isinstance(value,Cycle): raise ValueError('value muse be Cycle instace') value.square=value.pi * (value.r**2)

你想一想,這樣是不是感覺如果計算需求越來越多,代碼是不是還是會越來越臟?

如果我們將函數放在類里,并且用繼承的特性,我們可以寫出這樣的代碼

class Geometry: def get_square(self): raise NotImplementedErrorclass Rectangle(Geometry): def __init__(self,length,height): self.length=length self.height=height def get_square(self): return self.length*self.heightclass Cycle(Geometry): def __init__(self,r): self.pi=3.14 self.r=r def get_square(self): return self.pi * (self.r**2)def square(value): if not isinstance(value,Geometry): raise ValueError('value muse be Geometry instace') value.square=value.get_square()

你看,我們現在只需要給用戶暴露一個統一的接口,用戶(用戶也以是我們自己)不需要關心怎么樣選擇正確的函數,他只需要調用統一的 square 函數,就可以獲取到具體的面積,是不是輕松很多了??

所以,類,它是對數據,操作的一種封裝,這個封裝的意義在于我們可以去更好的優化代碼結構。

好了再舉一個例子,我們可以用類來控制訪問權限

class People: def __init__(self,website): self.__favorite_website='1024.com' def bad_or_not(self): return self.__favorite_website=='1024.com'

你看,我們用 private 變量,來確保外部沒法直接訪問一些敏感數據(實際上 Python 里 private 并不嚴格,hook 一下還是可以訪問的)

好,在舉一個例子

class People: def __init__(self,website): self.__favorite_website='1024.com' def bad_or_not(self): return self.__favorite_website=='1024.com' @property def favorite_website(self): return self.__favorite_website @favorite_website.setter def favorite_website(self,value): if value=='1024.com': raise ValueError('你不能去草榴,兄弟,你營養不足') self.__favorite_website=value

你看,我們現在很方便的實現在設置數據值的時候,對其過濾。

撤了這么多,回到你的問題

首先A君說的沒毛病,但我想知道僅僅使用函數錘子,螺絲刀來完成一個項目比使用Class工廠+函數錘子來完成一個項目的效率會更低么?

理由是什么?大神在什么時候會考慮使用Class來提高代碼的“執行效率”和代碼的“可讀性”。回歸實際情況,我很多時候都是調用同一個函數/方法去輸出某個結果。

至今還想不出為什么調用Class會更方便?(PS:本人大菜鳥,寫了上千行代碼了,但仍然搞不懂什么情況下需要用到Class類。也曾嘗試在自己的代碼中強行加入Class輸出結果

但感覺不靈活,而且要寫的代碼明顯多了也不便于理解。求大神舉例,碾壓我的無知!)。C君說大型項目不使用Class調用對象會累死,到底這個“累死”體現在哪里?

首先一個問題,我整個答案里所寫的這些代碼,不用面向對象這一套能不能實現?

很明顯,能。

但是實現的干凈么?個人覺得不干凈。

項目規格上去后,我們如果按照傳統的方式進行開發,務必要多重檢查,確保自己不會手抖調用了錯誤的東西。而 OOP 這一套思想,其實就是通過利用合適的代碼結構和封裝,某種程度上來講是減少我們犯錯的可能。

同時,現在開發基本都不是一個人的單打獨斗,你寫的代碼可能會被其余人使用與維護。我們有個前提,要假設使用維護你代碼的人都是傻逼。我們要適當的封裝代碼,優化結構,讓使用者盡可能的少犯錯、

所以最后,無論是各個語言的變量命名規則也好,還是 OOP 這一套范式也好。其本質是在自由度與可讀性可維護性之間的一種相對較優的妥協,這種妥協根本的目的就在于通過規范化的操作與封裝,減少團隊開發維護的成本,優化開發體驗。

另外,關于開發這一套還有個老生常談的問題過度封裝。我個人的觀點是在你知道什么是 過度封裝 之前,你沒必要考慮這個問題,按照教科書和開源代碼里的結構,去不斷封裝優化你的代碼。

面向對象 更容易使用 ,缺點就是 換一個開發人,難維護,很難理解前面人的思維,出了錯不好找位置

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 消防泵-XBD单级卧式/立式消防泵-上海塑泉泵阀(集团)有限公司 | 招商帮-一站式网络营销服务|搜索营销推广|信息流推广|短视视频营销推广|互联网整合营销|网络推广代运营|招商帮企业招商好帮手 | 天一线缆邯郸有限公司_煤矿用电缆厂家_矿用光缆厂家_矿用控制电缆_矿用通信电缆-天一线缆邯郸有限公司 | 不锈钢复合板厂家_钛钢复合板批发_铜铝复合板供应-威海泓方金属复合材料股份有限公司 | 广州网站建设_小程序开发_番禺网站建设_佛山网站建设_粤联网络 | ◆大型吹塑加工|吹塑加工|吹塑代加工|吹塑加工厂|吹塑设备|滚塑加工|滚塑代加工-莱力奇塑业有限公司 | 电伴热系统施工_仪表电伴热保温箱厂家_沃安电伴热管缆工业技术(济南)有限公司 | 大立教育官网-一级建造师培训-二级建造师培训-造价工程师-安全工程师-监理工程师考试培训 | 真空粉体取样阀,电动楔式闸阀,电动针型阀-耐苛尔(上海)自动化仪表有限公司 | 纳米二氧化硅,白炭黑,阴离子乳化剂-臻丽拾科技| 蒜肠网-动漫,二次元,COSPLAY,漫展以及收藏型模型,手办,玩具的新媒体.(原变形金刚变迷TF圈) | 圆盘鞋底注塑机_连帮鞋底成型注塑机-温州天钢机械有限公司 | 丙烷/液氧/液氮气化器,丙烷/液氧/液氮汽化器-无锡舍勒能源科技有限公司 | 特材真空腔体_哈氏合金/镍基合金/纯镍腔体-无锡国德机械制造有限公司 | 档案密集架_电动密集架_移动密集架_辽宁档案密集架-盛隆柜业厂家现货批发销售价格公道 | 建筑资质代办_工程施工资质办理_资质代办公司_北京众聚企服 | 山东太阳能路灯厂家-庭院灯生产厂家-济南晟启灯饰有限公司 | 精密五金冲压件_深圳五金冲压厂_钣金加工厂_五金模具加工-诚瑞丰科技股份有限公司 | 北京普辉律师事务所官网_北京律师24小时免费咨询|法律咨询 | TPE塑胶原料-PPA|杜邦pom工程塑料、PPSU|PCTG材料、PC/PBT价格-悦诚塑胶 | 环压强度试验机-拉链拉力试验机-上海倾技仪器仪表科技有限公司 | 天助网 - 中小企业全网推广平台_生态整合营销知名服务商_天助网采购优选 | 石栏杆_青石栏杆_汉白玉栏杆_花岗岩栏杆 - 【石雕之乡】点石石雕石材厂 | 深圳市东信高科自动化设备有限公司 | 气动隔膜泵厂家-温州永嘉定远泵阀有限公司 | 铸钢件厂家-铸钢齿轮-减速机厂家-淄博凯振机械有限公司 | 低噪声电流前置放大器-SR570电流前置放大器-深圳市嘉士达精密仪器有限公司 | 不锈钢丸厂家,铝丸,铸钢丸-淄博智源铸造材料有限公司 | 插针变压器-家用电器变压器-工业空调变压器-CD型电抗器-余姚市中驰电器有限公司 | PAS糖原染色-CBA流式多因子-明胶酶谱MMP-上海研谨生物科技有限公司 | 牛皮纸|牛卡纸|进口牛皮纸|食品级牛皮纸|牛皮纸厂家-伽立实业 | 泉州陶瓷pc砖_园林景观砖厂家_石英砖地铺石价格 _福建暴风石英砖 | 机械立体车库租赁_立体停车设备出租_智能停车场厂家_春华起重 | 组织研磨机-高通量组织研磨仪-实验室多样品组织研磨机-东方天净 传递窗_超净|洁净工作台_高效过滤器-传递窗厂家广州梓净公司 | 断桥铝破碎机_发动机破碎机_杂铝破碎机厂家价格-皓星机械 | 升降机-高空作业车租赁-蜘蛛车-曲臂式伸缩臂剪叉式液压升降平台-脚手架-【普雷斯特公司厂家】 | 无锡市珂妮日用化妆品有限公司|珂妮日化官网|洗手液厂家 | 北京印刷厂_北京印刷_北京印刷公司_北京印刷厂家_北京东爵盛世印刷有限公司 | 雷达液位计_超声波风速风向仪_雨量传感器_辐射传感器-山东风途物联网 | 高中学习网-高考生信息学习必备平台 | 南京展台搭建-南京展会设计-南京展览设计公司-南京展厅展示设计-南京汇雅展览工程有限公司 |