天天看點

python之面向對象python程式設計分為三個階段:

python程式設計分為三個階段:

  1. 面向過程程式設計:根據業務邏輯從上到下壘
  2. 函數式程式設計:将某功能進行函數封裝,使用時調用函數即可,減少代碼重複量
  3. 面向對象程式設計:對函數進行分類和封裝

理論上我們是比較鄙視面向過程程式設計的,那麼問題來了,那函數式程式設計和面向對象程式設計我們該用哪個呢?

先來看兩個的特點吧:

  • 函數程式設計,邏輯清晰,簡單,為項目而生,維護困難,函數式程式設計提倡的解決方案是資料是不可變的, 就沒有了一直在改變的狀态, 進而降低了複雜度.
  • 面向對象,大而全,複雜,為大項目而生,開發周期長,理論上長久維護簡單,實際上一塌糊塗...面向對象一個最大的特點是抽象, 是以面向對象式程式設計特别适合處理業務邏輯,是以被廣泛應用于目前的軟體開發當中.

總結

  • 那麼什麼情況下用面向對象呢?當某一些函數具有相同參數時,可以使用面向對象的方式,将參數值一次性的封裝到對象,以後去對象中取值即可,我覺得這個是對于我這種初學者的最簡答案了吧...
  • 什麼時候使用函數式程式設計呢?各個函數之間是獨立且無共用的資料

類和對象的建立

面向對象程式設計方式的落地,需要使用類和對象來實作:

  • 類可以看為一個模闆,模闆了包含了多個函數,函數實作某些功能
  • 對象是根據模闆建立的執行個體,通過執行個體對象可以調用類中的功能函數
python之面向對象python程式設計分為三個階段:
  • class是關鍵詞,聲明建立一個類
  • 類後面加(),表示建立對象
  • 類中定義函數時,第一個參數必須為self,而類中的函數稱為方法

面向對象的三大特性

  1. 封裝
  2. 繼承
  3. 多态

面向對象之封裝

封裝就是将内容封裝到某個地方,以後再去調用被封裝在某處的内容,在使用面向對象的封裝特性時,需要:

  1. 将内容封裝到某處
  2. 從某處調用被封裝的内容
#!/usr/bin/env python
#-*- coding:utf-8 -*-
class Port:
    def __init__(self,total):
        """
        __init__稱之為構造方法
        :param total: Port類傳遞的參數
        """
        self.total = total

    def num(self):
        print(self.total)



obj = Port('123')
obj.num()      

面向對象之繼承基礎

繼承,面向對象中的繼承和現實生活中的繼承相同,即:子可以繼承父的内容。

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

class People:
    def __init__(self):
        print("""
        你的通用特征有:四肢、頭發、眼、耳朵
        """)

class China(People):
    def info(self):
        print("""
        你是中國人,你的語言是中文,皮膚是黃色
        """)

class Us(People):
    def info(self):
        print("""
        你是美國人,你的語言是英文,皮膚是黑色
        """)

c = China()
c.info()

m = Us()
m.info()      

多繼承

python中的繼承可以多繼承,意思就是一個子類可以有多個父類,比如:

多繼承中需要注意的是:

  • 多繼承時,按照繼承的順序排優先級c3(c2,c1)

  深度優先,無共同父類,多繼承方式

  圖待定……

面向對象中的類成員

  1. 字段
  2. 方法
  3. 屬性

字段

字段分為兩種:

  • 普通字段
  • 靜态字段
python之面向對象python程式設計分為三個階段:

普通字段我們使用的較多,一般是在構造方法時使用.

靜态字段在代碼加載時已經建立

字段 儲存位置 規則
普通字段 儲存在對象中 隻能用對象去通路
靜态字段 儲存在類中(節約記憶體空間) 對象/類均可通路,但一般使用類通路,萬不得已才使用對象通路)

方法

所有方法都屬于類,類基本可以分為三中類型:

  • 普通方法
  • 靜态方法
  • 類方法
方法 調用方式 特征
普通方法 由對象去調用執行,屬于類 至少一個self,對象調用
靜态方法 屬于類,但通過類來調用,不依賴于任何對象,方法内部不需要對象封裝的值時,可使用靜态方法 任意參數,沒有self,上面添加@staticmethod,類似裝飾器的東東
類方法 靜态方法的一種特殊形式,由類調用 至少一個cls參數,上面添加classmethod

靜态方法:

class Province:
    country='中國' #靜态字段

    def __init__(self,name):
        self.name=name #普通字段

    @staticmethod   #靜态方法
    def show(arg1,arg2):
        print(arg1,arg2)

print(Province.country)
hn=Province('HN')
print(hn.country)
Province.show(123,456)   #靜态方法調用      

屬性

屬性的特征:具有方法的寫作形式,具有字段的通路形式.可取值,可設定,可删除.

先來看看屬性是個什麼東西吧:

class Pager:
    def __init__(self,all_count):
        self.all_count=all_count

    @property       #定義屬性
    def all_pager(self):
        a1,a2=divmod(self.all_count,10)
        if a2==0:
            return a1
        else:
            return a1+1

    @all_pager.setter       #指派屬性,将value指派給方法的參數
    def all_pager(self,value):
        print(value)

    @all_pager.deleter      #删除屬性
    def all_pager(self):
        print('del all_pager')

obj=Pager(101)
ret=obj.all_pager #不需要加括号
print(ret)

obj.all_pager=102

del obj.all_pager      

屬性的基本使用

屬性的定義和調用需要注意以下幾點:

  • 定義時,在普通方法的基礎上添加@property裝飾器
  • 定義時,屬性僅有一個self參數
  • 調用時,無需括号,obj.all_paper

屬性存在的意義:通路屬性時,可以制造出和通路字段完全相同的假象,由于屬性是由方法變種而來,如果python中沒有屬性,完全可以由方法來替代.

屬性的兩種定義方式

python3中全都是新式類,有三種@property裝飾方式:

  • @property
  • 方法名.setter
  • 方法名.deleter

其實就像上面的例子.

還有一種方式是靜态字段方式.建立值為property的對象的靜态字段.

來看個例子:

class Pager:
    def __init__(self,name):
        self.name=name

    def f1(self):
        return 123

    def f2(self,value):
        print(value)

    def f3(self):
        print('del....')

    foo=property(fget=f1,fset=f2,fdel=f3)

obj=Pager(110)
ret=obj.foo #調用fget
print(ret)

obj.foo=778 #調用fset

del obj.foo #調用fdel      

類方法

類方法通過@classmethod裝飾器實作,類方法和普通方法的差別是, 類方法隻能通路類變量,不能通路執行個體變量

class StudentManagement(object):
    @classmethod
    def register(cls, school, course):
        student = Student(school=school, course=course)
        return student

    @classmethod
    def pay(cls, student, money):
        money = student.payment(paymoney=money)
        return {
            'student': student,
            'paymoney': money
        }

    @classmethod
    def select_class(cls, student, class_):
        student.select_class_(class_=class_)
        return {
            'course': class_.course.name,
            'teacher': class_.teacher.name,
        }      

轉載于:https://www.cnblogs.com/patrick0715/p/5832586.html