面向對象初識

一. 面向對象初識? ??

1.1 回顧面向過程編程vs函數式編程? ? ? ? ??

# 面向過程編程 測量對象的元素個個數。
s1 = 'fjdsklafsjda'
count = 0
for i in s1:count += 1l1 = [1,2,3,4]
count = 0
for i in l1:count += 1
面向過程編程
def func(s):count = 0for i in s:count += 1return count
func('fdsafdsa')
func([1,2,3,4])
函數式編程

通過對比可知:函數編程較之面向過程編程最明顯的兩個特點:

1,減少代碼的重用性。

2,增強代碼的可讀性。

1.2 函數式編程vs面向對象編程? ? ?

# 函數式編程# auth 認證相關
def login():passdef regisgter():pass# account 賬戶相關
def func1():passdef func2():pass# 購物車相關
def shopping(username,money):pass
def check_paidgoods(username,money):pass
def check_unpaidgoods(username,money):pass
def save(username,money):pass
函數式編程
class LoginHandler:def login(self):passdef regisgter(self):passclass Account:def func1(self):passdef func2(self):passclass ShoppingCar:def shopping(username,money):passdef check_paidgoods(username,money):passdef check_unpaidgoods(username,money):passdef save(username,money):pass
面向對象式編程

# 通過對比可以看出面向對象第一個優點:

面向對象編程:是一類相似功能函數的集合,使你的代碼更清晰化,更合理化。

說第二個優點之前,先看看什么是面向對象。

面向對象的程序設計的核心是對象(上帝式思維),要理解對象為何物,必須把自己當成上帝,上帝眼里世間存在的萬物皆為對象,不存在的也可以創造出來。

那什么是類?什么是對象?

類:就是具有相同屬性和功能的一類事物。

對象:就是類的具體表現。

具體一些:先解釋解釋什么是?? 有轱轆, 有?向盤, 有發動機, 會跑的是?. 好. 在解釋?個. 什么是?. 有名字, 年齡, 愛好, 會唱歌跳舞思考的是?.那么廣義上 車,人就是類:但是具體的我的車,你這個人這是一個對象。

貓,是一類,你們家養的 大橘。

狗,是一類,隔壁家養的那只二哈就是對象。

?向對象思維, 要??建立對象. ??建立場景. 你是就是?向對象世界中的上帝. 你想讓??嘛就?嘛. 你想讓??嘛?就能?嘛。

再說第二個優點:面向對象,要擁有上帝的視角看問題,類其實就是一個公共模板(廠房),對象就從具體的模板實例化出來(慢慢體會)。

1.3類的結構

class Human:"""此類主要是構建人類"""mind = '有思想'  # 第一部分:靜態屬性 屬性 靜態變量 靜態字段dic = {}l1 = []def work(self): # 第二部分:方法 函數 動態屬性print('人類會工作')
class 是關鍵字與def用法相同,定義一個類。
Human是此類的類名,類名使用駝峰(CamelCase)命名風格,首字母大寫,私有類可用一個下劃線開頭。
類的結構從大方向來說就分為兩部分:
靜態變量。
動態方法。

二. 從類名的角度研究類? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

2.1 類名操作靜態屬性

?  2.11 第一種,查看類中的所有內容類名.__dict__方式。

class Human:"""此類主要是構建人類"""mind = '有思想'  # 第一部分:靜態屬性 屬性 靜態變量 靜態字段dic = {}l1 = []def work(self): # 第二部分:方法 函數 動態屬性# print(self)print('人類會工作')print(Human.__dict__)
print(Human.__dict__['mind'])
Human.__dict__['mind'] = '無腦'
print(Human.__dict__)  # 錯誤
#通過這種方式只能查詢,不能增刪改.# 第一種方式只用戶查詢全部內容(一般不用單獨屬性查詢).

2.12 第二種:萬能的點.??

?

class Human:"""此類主要是構建人類"""mind = '有思想'  # 第一部分:靜態屬性 屬性 靜態變量 靜態字段dic = {}l1 = []def work(self): # 第二部分:方法 函數 動態屬性# print(self)print('人類會工作')
print(Human.mind)  #
Human.mind = '無腦'  #
print(Human.mind)
del Human.mind  #
Human.walk = '直立行走'
print(Human.walk)
# 通過萬能的點 可以增刪改查類中的單個屬性

?

對以上兩種做一個總結:如果想查詢類中的所有內容,通過 第一種__dict__方法,如果只是操作單個屬性則用萬能的點的方式。

2.2 類名操作動態方法? ? ? ? ?

  前提:除了兩個特殊方法:靜態方法,類方法之外,一般不會通過類名操作一個類中的方法。

class Human:"""此類主要是構建人類"""mind = '有思想'  # 第一部分:靜態屬性 屬性 靜態變量 靜態字段dic = {}l1 = []def work(self): # 第二部分:方法 函數 動態屬性# print(self)print('人類會工作')def tools(self):print('人類會使用工具')Human.work(111)
Human.tools(111)
下面可以做,但不用。
Human.__dict__['work'](111)

三. 從對象的角度研究類? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

3.1 什么是對象

對象是從類中出來的,只要是類名加上(),這就是一個實例化過程,這個就會實例化一個對象。

執行下列代碼會發生什么事情?

實例化:類名加括號就是實例化,會自動觸發__init__函數的運行,可以用它來為每個實例定制自己的特征

class Human:mind = '有思想'def __init__(self):print(666)print(self)  # <__main__.Human object at 0x00000191508AA828>def work(self): print('人類會工作')def tools(self):print('人類會使用工具')
obj = Human() # 只要實例化對象,它會自動執行__init__方法
print(obj)  # <__main__.Human object at 0x00000191508AA828>
# 并且obj的地址與self的地址相同

其實實例化一個對象總共發生了三件事:

  1,在內存中開辟了一個對象空間。

  2,自動執行類中的__init__方法,并將這個對象空間(內存地址)傳給了__init__方法的第一個位置參數self。

  3,在__init__ 方法中通過self給對象空間添加屬性。

示例:

class Human:mind = '有思想'language = '使用語言'def __init__(self,name,sex,age,hobby):# self 和 obj 指向的是同一個內存地址同一個空間,下面就是通過self給這個對象空間封裝四個屬性。self.n = nameself.s = sexself.a = ageself.h = hobbyobj = Human('barry','',18,'運動')

3.2 對象操作對象空間屬性? ? ? ??

  3.21 對象查詢對象中所有屬性:??對象.__dict__

class Human:mind = '有思想'language = '實用語言'def __init__(self,name,sex,age,hobby):# self 和 obj 指向的是同一個內存地址同一個空間,下面就是通過self給這個對象空間封裝四個屬性。self.n = nameself.s = sexself.a = ageself.h = hobbyobj = Human('barry','',18,'運動')
print(obj.__dict__)  # {'n': 'barry', 'h': '運動', 's': '男', 'a': 18}

3.22 對象操作對象中的單個屬性:?萬能的點 .

class Human:mind = '有思想'language = '實用語言'def __init__(self,name,sex,age,hobby):# self 和 obj 指向的是同一個內存地址同一個空間,下面就是通過self給這個對象空間封裝四個屬性。self.n = nameself.s = sexself.a = ageself.h = hobbyobj = Human('barry','',18,'運動')
obj.job = 'IT'  #
del obj.n  #
obj.s = '' #
print(obj.s)  #
print(obj.__dict__)

3.3 對象查看類中的屬性? ? ? ?

class Human:mind = '有思想'language = '實用語言'def __init__(self,name,sex,age,hobby):self.n = nameself.s = sexself.a = ageself.h = hobbyobj = Human('barry','',18,'運動')
print(obj.mind)
print(obj.language)
obj.a = 666
print(obj.a)

3.4 對象操作類中的方法? ?

class Human:mind = '有思想'language = '實用語言'def __init__(self,name,sex,age,hobby):self.n = nameself.s = sexself.a = ageself.h = hobbydef work(self):print(self)print('人類會工作')def tools(self):print('人類會使用工具')obj = Human('barry','',18,'運動')
obj.work()
obj.tools()

類中的方法一般都是通過對象執行的(除去類方法,靜態方法外),并且對象執行這些方法都會自動將對象空間傳給方法中的第一個參數self.

self 是什么?

?

self其實就是類中方法(函數)的第一個位置參數,只不過解釋器會自動將調用這個函數的對象傳給self。所以咱們把類中的方法的第一個參數約定俗成設置成self, 代表這個就是對象。

一個類可以實例化多個對象

obj1= Human('小胖','',20,'美女')
obj2= Human('相爺','',18,'肥女')
print(obj1,obj2)
print(obj1.__dict__)
print(obj2.__dict__)

?總結

類名:
1,查看所有方法:類名.__dict__
2,查看類中的靜態變量:類名.mind(類名.__dict__['mind']  不建議)
3,查看類中的動態方法:類名.方法名(參數)   #需要傳參
對象:
obj = 類名()
1,在內存中創建了一個空間
2,自動執行__init__(self),并將空的對象空間傳給self.
3,在__init__方法中,給空的對象空間封裝一些屬性,并將完善好的這個對象返回給 類名() 這個對象

創造一個對象的流程:
1,首先要創造一個對象,產生一些類對象的指針
2,會自動的觸發__init__,將創造出來的對象的地址傳給self
3,執行__init__中的代碼
4,將self指向的地址再返回給調用者

1,對象查看自己空間的所有屬性:
對象.__dict__
2,對象操作自己的屬性,萬能的點:
對象.屬性名(增刪改查)
3,對象可以查詢類中的靜態字段(變量):
對象.靜態變量
4,對象可以查詢類中的動態方法:
對象.方法名()   #不需要傳參

?

轉載于:https://www.cnblogs.com/ls13691357174/p/10472230.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/278240.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/278240.shtml
英文地址,請注明出處:http://en.pswp.cn/news/278240.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS逆向:在任意app上開啟malloc stack追蹤內存來源

lldb有一個內存調試工具malloc stack&#xff0c;開啟以后就可以查看某個內存地址的malloc和free記錄&#xff0c;追蹤對象是在哪里創建的。 這個工具可以打印出對象創建的堆棧&#xff0c;而在逆向時&#xff0c;也經常需要追蹤某些方法的調用棧&#xff0c;如果可以隨時打印出…

【CH4302】Interval GCD

思路&#xff1a;線段樹維護a的差分數組的gcd&#xff0c; 因為$gcd(a_1,a_2,a_3,...,a_n)gcd(a_1,a_2-a_1,a_3-a_2,...,a_n-a_{n-1})$。 原區間修改可以轉化為差分數組上的兩次單點修改。 因為實際計算時還需要原數&#xff0c;所以用樹狀數組維護b的增減量。 詢問時&#xff…

Vue 的路由實現 Hash模式 和 History模式

Hash 模式: Hash 模式的工作原理是onhashchange事件&#xff0c;Window對象可以監聽這個事件... 可以通過改變路徑的哈希值&#xff0c;來實現歷史記錄的保存&#xff0c;發生變化的hash 都會被瀏覽器給保存下來&#xff0c;所以下次盡管瀏覽器沒有請求服務器&#xff0c;但是還…

我的第一次——網站備案

暫無內容 轉載于:https://my.oschina.net/vright/blog/1784979

使用LiveClick升級您的實時書簽

If you like to subscribe to feeds using Firefox’s Live Bookmarks feature, the LiveClick extension gives you so many upgrades that I can only cover the highlights of how great it is. 如果您想使用Firefox的“實時書簽”功能訂閱供稿&#xff0c;則LiveClick擴展程…

操作系統的概論梳理

轉載于:https://www.cnblogs.com/hclhechunlu/p/10477470.html

win7下如何顯示緬文和使用緬文輸入法?

windows 7 操作系統默認不支持緬文&#xff0c;所以緬文在win7上不能顯示&#xff0c;當然也沒有提供緬文輸入法。 一、顯示緬文 windows系統下顯示緬文字母只需要安裝緬文字體就可以了。目前常見的緬文字體就是Zawgyi-One&#xff0c;Zawgyi-One是一種廣泛使用的緬文字體。Zaw…

airpods2使用_如何使用AirPods和AirPods Pro:完整指南

airpods2使用Burdun Iliya/ShutterstockBurdun Iliya /快門Just bought yourself or received a new pair of AirPods or AirPods Pro? Welcome to the truly wireless earphones life. Setting up AirPods is quite straightforward, but here’s how to customize and get t…

LANG

修改 /etc/sysconfig/i18n 文件 locale 查看字符集 轉載于:https://www.cnblogs.com/todayORtomorrow/p/10479594.html

如何在iPhone上共享視頻之前從視頻中刪除音頻

Sometimes, you’d like to share a video with others, but the accompanying audio track is distracting or perhaps introduces privacy concerns. Luckily, there’s a quick way to silence a video using Photos on iPhone and iPad. Here’s how. 有時&#xff0c;您想…

入門第十一課 Python語句的嵌套

1、說個小故事&#xff1a;話說一個人買到一個治療瘙癢的偏方&#xff0c;在拆開無數層的包裝后&#xff0c;得到的只是一張寫著“撓撓”的小紙條兒。 嵌套&#xff0c;類似于在一個語句中&#xff0c;嵌套另一個語句。舉個栗子-_-!! 我們要計算從1到100之間&#xff0c;所有的…

【TensorFlow篇】--Tensorflow框架實現SoftMax模型識別手寫數字集

一、前述 本文講述用Tensorflow框架實現SoftMax模型識別手寫數字集&#xff0c;來實現多分類。 同時對模型的保存和恢復做下示例。 二、具體原理 代碼一&#xff1a;實現代碼 #!/usr/bin/python # -*- coding: UTF-8 -*- # 文件名: 12_Softmax_regression.pyfrom tensorflow.ex…

web頁面鎖屏初級嘗試

因為工作需要&#xff0c;所以在網上找了一些素材來弄這個功能。在我找到的素材中&#xff0c;大多都是不完善的。雖然我的也不是很完善&#xff0c;但是怎么說呢。要求不是很高的話。可以直接拿來用的【需要引用jQuery】。廢話不多說直接上代碼 這部分是js代碼 1 <script&g…

Java 并發工具箱之concurrent包

概述 java.util.concurrent 包是專為 Java并發編程而設計的包。包下的所有類可以分為如下幾大類&#xff1a; locks部分&#xff1a;顯式鎖(互斥鎖和速寫鎖)相關&#xff1b;atomic部分&#xff1a;原子變量類相關&#xff0c;是構建非阻塞算法的基礎&#xff1b;executor部分&…

如何提高gps精度_如何在鍛煉應用程序中提高GPS跟蹤精度

如何提高gps精度l i g h t p o e t/Shutterstocklightpoet /快門Tracking your runs, bike rides, and other workouts is fun because you can see how much you’re improving (or, in my case, dismally failing to improve). For it to be effective, though, you have to …

centos proftp_在CentOS上禁用ProFTP

centos proftpI realize this is probably only relevant to about 3 of the readers, but I’m posting this so I don’t forget how to do it myself! In my efforts to ban the completely insecure FTP protocol from my life entirely, I’ve decided to disable the FTP…

Java通過Executors提供四種線程池

http://cuisuqiang.iteye.com/blog/2019372 Java通過Executors提供四種線程池&#xff0c;分別為&#xff1a;newCachedThreadPool創建一個可緩存線程池&#xff0c;如果線程池長度超過處理需要&#xff0c;可靈活回收空閑線程&#xff0c;若無可回收&#xff0c;則新建線程。n…

一個在線編寫前端代碼的好玩的工具

https://codesandbox.io/ 可以編寫 Angular&#xff0c;React&#xff0c;Vue 等前端代碼。 可以實時編輯和 preview。 live 功能&#xff0c;可以多人協作編輯&#xff0c;不過是收費的功能。 可以增加依賴的包&#xff0c;比如編寫 React 時&#xff0c;可以安裝任意的第三…

MySQL數據庫基礎(五)——SQL查詢

MySQL數據庫基礎&#xff08;五&#xff09;——SQL查詢 一、單表查詢 1、查詢所有字段 在SELECT語句中使用星號“”通配符查詢所有字段在SELECT語句中指定所有字段select from TStudent; 2、查詢指定字段 查詢多個字段select Sname,sex,email from TStudent; 3、查詢指定記錄…

使用生成器創建新的迭代模式

一個函數中需要有一個 yield 語句即可將其轉換為一個生成器。 def frange(start, stop, increment):x startwhile x < stop:yield xx incrementfor i in frange(0, 4, 2):print(i) # 0 2 一個生成器函數主要特征是它只會回應在迭代中使用到的 next 操作 def cutdata(n):p…