函數式編程與面向對象編程的對比

函數:

  def login():

    user = input('請輸入用戶名:')

    pwd = input('請輸入密碼:')

    if user == 'alex' and pwd == 'sb':

      print('登錄成功')

    else:

      print('登錄失敗')

面向對象:

  class Account:

    def login(self):

      user = input('請輸入用戶名:')

      pwd = input('請輸入密碼:')

      if user == 'alex' and pwd == 'sb':

        print('登錄成功')

      else:

        print('登陸失敗')

  obj = Account()

  obj.login() 

對比:

  函數:定義簡單/調用簡單。

  面向對象:定義複雜/調用複雜。  好處:歸類,將某些類似的函數寫在一起。

總結:

  1、函數式編程可能會比面向對象編程易於操作。

  2、python中支持兩種編程方式。

  3、面向對象編程方式格式:

    定義:

      class 類名:              — 定義了一個類

        def 函數名(self):          — 在類中編寫了一個【方法】

          pass

    調用:

      變量名 = 類名()             — 創建了一個對象/實例化一個對象,變量名爲一個實例化的對象。

      變量名.函數名()             — 通過對象調用其中一個方法。

  4、示例:

    class Account:

      def login(self):

        user = input('請輸入用戶名:')

        pwd = input('請輸入密碼:')

        if user == 'alex' and pwd == 'sb':

          print('登錄成功')

        else:

          print('登錄失敗‘)

    obj = Account()

    obj.login()

===============================================================================================

完成以下功能:

  零零/20歲/女/喜歡下河洗澡

  零零/20歲/女/喜歡上山採藥

  零零/20歲/女/喜歡在家做飯

 

函數編程方式示例2:

def xz(name,age,gender):

  data = "%s,今年%s歲,性別%s,喜歡下河洗澡"  %(name,age,gender)

  print(data)

def cy(name,age,gender):

  data = "%s,今年%s歲,性別%s,喜歡上山採藥"  %(name,age,gender)

  print(data)

def zf(name,age,gender):

  data = "%s,今年%s歲,性別%s,喜歡在家做飯"  %(name,age,gender)

  print(data)

xz('零零',20,'女')

cy('零零',20,'女')

zf('零零',20,'女')

 

面向對象編程方式示例2:

class LingLing:

  def __init__(self,name,age,gender):         #特殊的方法,如果   類名()  ,則該方法會被自動執行

    self.name = name

    self.age = age

    self.gender = gender

  def xz(self):

    data = "%s,今年%s歲,性別%s,喜歡下河洗澡"  %(self.name,self.age,self.gender)

    print(data)

  def cy(self):

    data = "%s,今年%s歲,性別%s,喜歡上山採藥"  %(self.name,self.age,self.gender)

    print(data)

  def zf(self):

    data = "%s,今年%s歲,性別%s,喜歡在家做飯"  %(self.name,self.age,self.gender)

    print(data)

obj = LingLing('零零',20,'女')

obj.xz()

obj.cy()

obj.zf()

 

總結:

  1.構造方法

    示例一:

      class Foo:

        def __init__(self,name):    構造方法,目的進行數據初始化。

          self.name = name

          self.age = 10

      obj = Foo("韓寒")               【self既是obj】

      通過構造方法,可以將數據進行打包,以後使用時,去其中獲取即可。

    示例二:

      class Bar:

        pass

      obj = Bar()

  2.應用

    a.將數據封裝到對象中,以供自己在方法中調用

      

 

    b.將數據封裝到對象中以供其他函數調用

      class Foo:

        def __inti__(self,k1,k2,k3):

          self.k1 = k1

          self.k2 = k2

          self.k3 = k3

      obj = Foo(111,222,333)

      def new_func(arg):

        arg.k1

        arg.k2

        arg.k3

      new_func(obj)

 

  3.面向對象的三大特性:封裝/繼承/多態

    【封裝】:===================================

      將相關功能封裝到一個類中:

        class Message:

          def email(self):pass

          def msg(self):pass

          def wechat(self):pass

      將數據封裝到一個對象中:

        class Person:

          def __init__(self,name,age,gender):

            self.name = name

            self.age = age

            self.gender = gender

        obj = person('孫莉莉',18,'女')

    【繼承】:===================================

      基本使用:

      class SuperBase:

        def f3(self):

          print('f3')

      class Baes(SuperBase):    # 父類,基類

        def f2(self):

          print('f2')

      class Foo(Base):    # 子類,派生類

        def f1(self):

          print('f1')

      obj = Foo()

      obj.f1()

      obj.f2()

      obj.f3()

      #原則:先在自己類中找,沒有就去找父類。【繼承的作用是爲了提高代碼的重用性】

      calss Base:      # 父類,基類

        def f1(self):

          pass

      class Foo(Base):    # 子類,派生類,繼承Base類中的f1方法

        def f2(self):

          pass

      class Bar(Base):    # 子類,派生類,繼承Base類中的f1方法

        def f3(self):

          pass

    【多繼承】:==================================

      

      calss Base1:      

        def show(self):

          print("Base1.show")

      calss Base2:     

        def show(self):

          print("Base2.show")

      calss Foo(Base1,Base2): 

        pass

      obj = Foo()

      obj.show()

 

  ==================【練習題1】========================

  class Base:

    def f1(self):

      print('base.f1')

  class Foo(Base):

    def f2(self):

      print('foo.f2')

  # 1、是否執行

  obj = Foo()

  obj.f2()

  obj.f1()

  #執行,先打印foo.f2後打印base.f1

  # 2、是否執行

  obj = Base()

  obj.f1()  # f1可執行

  obj.f2()  # f2非Base類的父級,無法執行操作,會報錯

  =======================【練習題2】========================  

  class Base:

    def f1(self):

      print('base.f1')

  class Foo(Base):

    def f3(self):

      print('foo.f3')

    def f2(self):

      print('foo.f2')

      self.f3()  #obj是哪一個類(Foo),那麼執行方法時,就從該類開始找。

  obj = Foo()

  obj.f2()  # obj是哪一個類(Foo),那麼執行方法時,就從該類開始找。

  ==============================================================

    # 總結:

      #1. self是哪個類的對象,那麼就從該類開始找(自己沒有就找父類)

      #2. 多繼承先找左邊的參數對應的父類。

  ==============================================================

    總結:

      1、繼承的編寫

        class Foo(父類):

          pass

      2、支持多繼承(先找左/再找右)

      3、爲什麼要有多繼承?提高代碼重用性

  【多態】:=====================================================

    多種形態或多種狀態。

    鴨子模型,只要可以呷呷叫就是鴨子。

 

    # 由於python原生支持多態,所以沒有特殊性。

    class Foo1:

      def f1(self):

        pass

    class Foo2:

      def f1(self):

        pass

    class Foo3:

      def f1(self):

        pass

    def func(arg):

      arg.f1()

    obj = Foo1()  #obj = Foo2()  obj = Foo3()

    func(obj)

====================================================

重點:

  1、編寫方式執行流程

  2、如何歸類?

    反向:歸類+提取公共值

    正向:類相關的功能+提取公共值

  3、三大特性:封裝/繼承/多態

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章