初識Python面向對象

2020-09-05 產品經理學python


⼀、匿名函數

1. 定義:

顧名思義就是函數沒有名字,使⽤lambda關鍵字定義的函數就是匿名函數,簡化代碼,增加運⾏效率。

  • 普通函數

def func(a,b,c):    return a+b+cprint(func(1,2,3))

  • 匿名函數

result = (lambda a,b,c:a+b+c)(1,2,3) print(result)

2. 特點:

匿名函數隻適合做一下簡單的操作,返回值不需要加上return,返回值就是該表達式的結果

用匿名函數有個好處,因為函數沒有名字,不必擔心函數名衝突。此外,匿名函數也是一個函數對象,也可以把匿名函數賦值給一個變量,再利用變量來調用該函數

二、面向對象編程

1. 面向對象or面向過程

面向對象編程——Object Oriented Programming,簡稱OOP,是一種程序設計思想。OOP把對象作為程序的基本單 元,一個對象包含了數據和操作數據的函數。

面向過程的程序設計把電腦程式視為一系列的命令集合,即一組函數的順序執行。為了簡化程序設計,面向過程把 函數繼續切分為子函數,即把大塊函數通過切割成小塊函數來降低系統的複雜度。

而面向對象的程序設計把電腦程式視為一組對象的集合,而每個對象都可以接收其他對象發過來的消息,並處理這 些消息,電腦程式的執行就是一系列消息在各個對象之間傳遞。

2. Python面向對象

在Python中,所有數據類型都可以視為對象,當然也可以自定義對象。自定義的對象數據類型就是面向對象中的類 (Class)的概念。

假設我們要處理學生的成績表,為了表示一個學生的成績,面向過程的程序可以用一個dict表示:

std1 = { 'name': 'Curry', 'score': 98 } std2 = { 'name': 'James', 'score': 81 }

而處理學生成績可以通過函數實現,比如列印學生的成績:

def print_socre(std):    print('%s:%s' % (std['name'],std['score']))

如果採用面向對象的程序設計思想,我們首選思考的不是程序的執行流程,而是Student這種數據類型應該被視為 一個對象,這個對象擁有name和score這兩個屬性(Property)。如果要列印一個學生的成績,首先必須創建出這 個學生對應的對象,然後,給對象發一個print_score消息,讓對象自己把自己的數據列印出來。

class Student(object):      def __init__(self, name, score):            self.name = name            self.score = score      def print_score(self):            print('%s: %s' % (self.name, self.score))

給對象發消息實際上就是調用對象對應的關聯函數,我們稱之為對象的方法(Method)。面向對象的程序寫出來就 像這樣:

bart = Student('Bart Simpson', 59) lisa = Student('Lisa Simpson', 87) bart.print_score() lisa.print_score()

面向對象的設計思想是從自然界中來的,因為在自然界中,(Class)和實例(Instance)的概念是很自然的。Class是一種抽象概念,比如我們定義的Class——Student,是指學生這個概念,而實例(Instance)則是一個個具 體的Student,比如,Bart Simpson和Lisa Simpson是兩個具體的Student。

所以,面向對象的設計思想是抽象出Class,根據Class創建Instance。

面向對象的抽象程度又比函數要高,因為一個Class既包含數據,又包含操作數據的方法。

三、類和對象

面向對象編程的2個非常重要的概念:類和對象

對象是面向對象編程的核心,在使用對象的過程中,為了將具有共同特徵和行為的一組對象抽象定義,提出了另外一 個新的概念——

類就相當於製造飛機時的圖紙,用它來進行創建的飛機就相當於對象

1. 類

人以類聚物以群分。具有相似內部狀態和運動規律的實體的集合(或統稱為抽象)。具有相同屬性行為事物的統稱 類是抽象的,在使用的時候通常會找到這個類的一個具體的存在,使用這個具體的存在。一個類可以找到多個對象

2. 對象

某一個具體事物的存在 ,在現實世界中可以是看得見摸得著的。可以是直接使用的

3. 類和對象之間的關係

類就是創建對象的模板

4. 定義類和創建對象

class 類名:    方法列表  經典類(舊式類)定義形式  新式類定義形式    def info(self):        print("hero")

說明:

  • 定義類時有2種形式:新式類和經典類,上面代碼中的Hero為新式類,前兩行注釋部分則為經典類;

  • object 是Python 裡所有類的最頂級父類;類名 的命名規則按照"大駝峰命名法";

  • info 是一個實例方法,第一個參數一般是self,表示實例對象本身,當然了可以將self換為其它的名字,其 作用是一個變量 這個變量指向了實例對象.

  • python中,可以根據已經定義的類去創建出一個或多個對象。

創建對象的格式為:

對象名1 = 類名()

對象名2 = 類名()

對象名3 = 類名()

class Hero(object):   Hero這個類 實例化了一個對象  hero = Hero()
. 表示選擇屬性或者方法hero.info()print(hero)   實例化了一個英雄對象hero = Hero()
姓名hero.hp = 2600   通過.成員選擇運算符,獲取對象的屬性值print("英雄 %s 的生命值 :%d" % (hero.name, hero.hp))
實例化了一個英雄對象hero=Hero()
姓名hero.hp=2600 通過.成員選擇運算符,獲取對象的實例方法hero.info()   Python 的類裡提供的,兩個下劃線開始,兩個下劃線結束的方法,就是魔法方法,__init__()就是一個魔法方法,通常用來做屬性初始化 或 賦值 操作。   如果為了能夠在完成自己想要的功能,可以自己定義__init__方法,   姓名       self.hp = 2600 實例化了一個英雄對象,並自動調用__init__()方法hero = Hero() 只需要調用實例方法info(),即可獲取英雄的屬性hero.move()

總結:

  • __init__()方法,在創建一個對象時默認被調用,不需要手動調用

  • __init__(self)中的self參數,不需要開發者傳遞,python解釋器會自動把當前的對象引用傳遞過去。

2. 有參數的init()方法

class Hero(object):    """定義了一個英雄類,可以移動和攻擊"""    def __init__(self, name, hp):        """ __init__() 方法,用來做變量初始化 或 賦值 操作"""         生命值:        self.hp = hp    def move(self):        """實例方法"""        print("%s 正在前往事發地點..." % self.name)    def info(self):        print("英雄 %s 的生命值 :%d" % (self.name, self.hp))       print(gailun) 不同對象的屬性值的單獨保存print(id(blind.name)) print(id(gailun.name))
父類class A(object):    def __init__(self):        self.num = 10    def print_num(self):        print(self.num + 10)        定義一個Person類class Person(object):    def __init__(self):         實例方法    def make_person(self):        print(" <%s> 造了一個人..." % self.name)        子類可以繼承父類所有的屬性和方法,哪怕子類沒有自己的屬性和方法,也可以使用父類的屬性和方法。    pass        
panda = Teacher()   子類對象可以直接使用父類的屬性damao.make_person()   實例變量,屬性           def make_person(self):                     多繼承,繼承了多個父類    pass  ls = Person()print(ls.name) ls.make_person()
重寫:子類繼承父類,父類的方法滿足不了子類的需要可以對父類的方法進行重寫 調用方法的時候先從本類去找,如果本來沒有再去父類去找,會遵循mro的特點stu.run()

4. 屬性方法

1. 類屬性和實例屬性

類屬性就是類對象所擁有的屬性,它被所有類對象的實例對象所共有,在內存中只存在一個副本,這個和C++中類的靜態成員變量有點類似。對於公有的類屬性,在類外可以通過類對象和實例對象訪問

class People(object):  name = 'Tom'  私有的類屬性  p = People()
print(p.name) 正確print(p.__age) 錯誤,不能在類外通過類對象訪問私有的類屬性實例屬性(對象屬性)class People(object):  address = '山東' 實例屬性    self.age = 20 實例屬性print(p.address) 正確print(p.age) 正確print(People.name) 錯誤
類屬性  print(People.country) p = People()print(p.country) p.country = 'japan'print(p.country) 刪除實例屬性print(p.country)

總結

如果需要在類外修改類屬性,必須通過類對象去引用然後進行修改。如果通過實例對象去引用,會產生一個同名的實例屬性,這種方式修改的是實例屬性,不會影響到類屬性,並且之後如果通過實例對象去引用該名稱的屬性,實例屬性會強制屏蔽掉類屬性,即引用的是實例屬性,除非刪除了該實例屬性。

2.靜態方法和類方法

(1)類方法

是類對象所擁有的方法,需要用修飾器@classmethod來標識其為類方法,對於類方法,第一個參數必須是類對象,一般以cls作為第一個參數(當然可以用其他名稱的變量作為其第一個參數,但是大部分人都習慣以'cls'作為第一個參數的名字,就最好用'cls'了),能夠通過實例對象和類對象去訪問。

class People(object):  country = 'china'    可以用過實例對象引用print(People.get_country())  類方法,用classmethod來進行修飾  @classmethod  def get_country(cls):    return cls.country    @classmethod  def set_country(cls,country):    cls.country = country    p = People()print(p.get_country())  可以通過類訪問
p.set_country('japan'
print(p.get_country())print(People.get_country())
靜態方法  def get_country():    return People.country
p = People() 通過類訪問靜態方法print(People.get_country())

總結

從類方法和實例方法以及靜態方法的定義形式就可以看出來,類方法的第一個參數是類對象cls,那麼通過cls引用的必定是類對象的屬性和方法;實例方法的第一個參數是實例對象self,那麼通過self引用的可能是類屬性、也有可能是實例屬性(這個需要具體分析),不過在存在相同名稱的類屬性和實例屬性的情況下,實例屬性優先級更高。靜態方法中不需要額外定義參數,因此在靜態方法中引用類屬性的話,必須通過類實例對象來引用

六、多態

'''多態, 不同的 子類對象調用 相同的 父類方法,產生 不同的 執行結果,可以增加代碼的外部 調用靈活度多態以 繼承 和 重寫 父類方法 為前提多態是調用方法的技巧,不會影響到類的內部設計'''class Animal(object):  def run(self):    print('Animal is running...')    class Dog(object):  def run(self):    print('Dog is running...')class Cat(object):  def run(self):    print('Cat is running...')    # 定義一個方法def run_twice(animal):  animal.run()  animal.run()dog = Dog()cat = Cat()run_twice(dog)run_twice(cat)


相關焦點

  • 詳解Python面向對象知識點
    目前代碼技能已經成了測試同學面試考核的剛需,對於測試開發來講需求最大的是java和python兩門語言,二者也都是面向對象語言。對於剛入門代碼的同學來說面向對象相關的概念比較難於理解,而面向對象編程相關的知識點偏偏又是面試中的高頻問題,所以本文我以python為例,帶大家快速搞定面向對象中的核心概念並通過代碼實現的方式來幫助大家對其加深理解!
  • opencv-python獲取圖像:面向對象與面向過程
    下面是分別用面向過程與面向對象的編程方法實現讀取本地圖像和打開攝像頭兩段代碼:# -*- coding: utf-8 -*-"""面向過程的編程方法,用函數把解決問題的步驟一步一步實現。運行環境:win10系統 python==3.6 opencv-contrib-python== 4.1.0第一行「# -*- coding: utf-8 -*-」 告訴Python解釋器,按照UTF-8編碼讀取原始碼"""import cv2image=cv2.imread('lena.JPG') #讀取本地圖片,
  • python教程之十一面向對象
    面向對象技術簡介不管何種語言,我們都提倡採用面向對象思想編程。上節我們介紹了GUI界面,下面代碼採用tkinter庫實現登陸界面來解釋說明面向對象技術涉及到的幾個術語。1、類(Class): 具有相同屬性和方法的對象的集合。定義了Login類,類定義的語法為 class className:2、方法:類中定義的函數。
  • 初識Python
    Python 簡介Python 是一個高層次的結合了解釋性、編譯性、互動性和面向對象的腳本語言• Python 是面向對象語言: 這意味著Python支持面向對象的風格或代碼封裝在對象的編程技術。Python官網:https://www.python.org/ 你可以在以下連結中下載 Python 的文檔,你可以下載 HTML、PDF
  • python面向對象這些概念不了解你怎麼學
    在常見的編程範式裡面有兩種比較常用的,一種是函數式編程、一種是面向對象, 面向對象是一個非常大的話題,筆者不敢亂言, 本文只是面向對象一些概念的理解,然後聊聊復用這回事廣義上類的組成在之前的文章中函數介紹中提過,函數是一個控制抽象,同時也提到面向對象是數據抽象, 其實從上面我們可以看出
  • python面向對象之異常處理
    捕獲異常 2.1 簡單的捕獲異常語法 在程序開發中,如果 對某些代碼的執行不能確定是否正確,可以增加 `try(嘗試)` 來 捕獲異常 捕獲異常最簡單的語法格式:```pythontry: 嘗試執行的代碼except: 出現錯誤的處理``` `try
  • Day1-初識Python
    初識Python 安裝Python解釋器想要開始Python編程之旅,首先得在自己使用的計算機上安裝Python解釋器環境,下面將以安裝官方的Python解釋器為例,講解如何在不同的作業系統上安裝Python環境。官方的Python解釋器是用C語言實現的,也是使用最為廣泛的Python解釋器,通常稱之為CPython。
  • 零基礎小白學python入門——面向對象基礎(建議收藏)
    new 一個對象面向過程VS面向對象學習交流環境,可以加入我們的python裙,關注小編,並私信「01」即可進裙,領取python學習資料,會節約很多時間,減少很多遇到的難題。的預測問題的處理流程與結果,面向對象的程序一旦開始就由對象之間的交互解決問題,即便是上帝也無法預測最終結果。
  • Python語法示例——面向對象
    1.自己寫一個Student類,此類的對象有屬性name, age, score, 用來保存學生的姓名,年齡,成績 2)寫一個函數output_student 列印這些學生信息(格式不限)class Student(): def __init__(self, name, age, score):
  • python面向對象之模塊文件讀寫
    | write | 將指定內容寫入文件 || 04 | close | 關閉文件 | `open` 函數負責打開文件,並且返回文件對象 `read`/`write`/`close` 三個方法都需要通過 文件對象 來調用 2.3 read 方法 —— 讀取文件 `open` 函數的第一個參數是要打開的文件名(文件名區分大小寫)
  • JS面向對象詳解
    面向對象與面向過程面向對象和面向過程是兩種不同的編程思想,剛開始接觸編程的時候,我們大都是從面向過程起步的,畢竟像我一樣,大家接觸的第一門計算機語言大概率都是C語言,C語言就是一門典型的面向過程的計算機語言。面向過程主要是以動詞為主,解決問題的方式是按照順序一步一步調用不同的函數。
  • Python 面向對象編程
    在學習面向對象編程時,我決定深入研究它的歷史,結果發現它很迷人。術語「面向對象編程」(OOP)是Alan Kay 在1966年研究生院時提出的。Simula語言是第一種具有面向對象編程特點的程式語言。它是在1967年開發的,用於製作模擬程序,其中最重要的信息稱為對象。
  • 如何理解 Python 中的面向對象編程?
    現如今面向對象編程的使用非常廣泛,本文我們就來探討一下Python中的面向對象編程。作者 | Radek Fabisiak譯者 | 彎月,責編 | 郭芮以下為譯文:Python支持多種類型的編程範式,例如過程式編程、函數式編程、面向對象編程,而且還可以融合多種類型的範式。
  • Python面向對象(封裝、繼承、多態)詳解
    面向對象的三大特徵:封裝、繼承、多態封裝私信小編01即可獲取Python學習資料概念:將一個對象的數據隱藏在對象內部,不讓在外界直接訪問,而是通過對象提供的方法來訪問這些隱藏起來的數據加兩個下劃線在語法上不能通過屬性名稱直接訪問屬性私有化是python
  • Python: 學習之路(1) - 初識
    首先,百度一下「python」,有個初步了解。是一個高層次的結合了解釋性、編譯性、互動性和面向對象的腳本語言。最初被設計用於編寫自動化腳本(shell),隨著版本的不斷更新和語言新功能的添加,越多被用於獨立的、大型項目的開發。
  • Python面向對象編程的一些見解
    正文:閒話說完,進入正題,Python語言是一門面向對象的語言,今天我們就講一下什麼是面向對象。面向對象編程已經成為一種現代程式設計師不可或缺的技能。那到底什麼是面向對象編程呢?這讓很多初學者不是很理解,進而導致他們放棄深入學習編程。
  • Python語法基礎(11)面向對象(高級篇)
    面向對象(高級篇),即:根據此類創建了多少對象,在內存中就有多少個普通欄位。而其他的成員,則都是保存在類中,即:無論對象的多少,在內存中只創建一份。,用於設置對象屬性的一些初始值。/usr/bin/env python 報錯:TypeError: iter() returned non-iterator of type &39;!/usr/bin/env python!
  • 資料|Python面向對象編程課件
    from=leiphonecolumn_res0928內容簡介Python從設計之初就已經是一門面向對象的語言,正因為如此,在Python中創建一個類和對象是很容易的。如果你以前沒有接觸過面向對象的程式語言,那你可能需要先了解一些面向對象語言的一些基本特徵,在頭腦裡頭形成一個基本的面向對象的概念,這樣有助於你更容易的學習Python的面向對象編程。
  • Python面向對象編程的基本概念
    由九道門商業數據分析學院提供介紹在學習面向對象的編程時。我決定深入了解它的歷史,結果令人著迷。術語「面向對象程序設計」(OOP)是艾倫·凱(Alan Kay)在1966年讀研究生時提出的。名為Simula的語言是第一種具有面向對象編程功能的程式語言。它是在1967年開發的,用於製作仿真程序,其中最重要的信息稱為對象。
  • 趣味解讀Python面向對象編程 (類和對象)
    一、面向對象簡介考慮現實生活中,我們的思維方式是放在學生這個個人上,是學生做了自我介紹。而不是像我們剛剛寫出的代碼,先有了介紹的行為,再去看介紹了誰。用我們的現實思維方式該怎麼用程序表達呢?面向過程:根據業務邏輯從上到下寫代碼。面向對象:將數據與函數綁定到一起,進行封裝,這樣能夠更快速的開發程序,減少了重複代碼的重寫過程。面向過程編程最易被初學者接受,其往往用一長段代碼來實現指定功能,開發過程的思路是將數據與函數按照執行的邏輯順序組織在一起,數據與函數分開考慮。