函數:
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、三大特性:封裝/繼承/多態