一、引入
面向過程編程(窮人的思想) :一遇到問題馬上想到的是怎么寫代碼把這個(gè)功能實(shí)現(xiàn)(邏輯)
函數(shù)式編程(小資的思想) :一遇到問題馬上想到有沒有一個(gè)函數(shù)已經(jīng)把這個(gè)功能實(shí)現(xiàn)了,如果有就拿過來用,沒有就定義一個(gè)有這個(gè)功能的函數(shù)(函數(shù))
面向?qū)ο缶幊?富豪的思想) :一遇到問題馬上想到有沒有一個(gè)類中有這個(gè)方法能夠把這個(gè)功能實(shí)現(xiàn),如果沒有就創(chuàng)建這個(gè)類(類和對(duì)象)
a = 10
b = 20
# 求變量a和b的和
print(a + b)
二、類和對(duì)象
1.什么是類、什么是對(duì)象
類就是擁有 相同屬性 和 相同功能 的 對(duì)象的集合(抽象)
對(duì)象就是類的實(shí)例(具體)
從生活的角度:
如果人是類, 余婷就是對(duì)象,駱老師是另一個(gè)對(duì)象
如果杯子是類,我桌上的這個(gè)杯子就是對(duì)象
2.定義類(說清楚共同屬性和功能是哪些)
語法:
class 類名:
????????類的說明文檔
????????類的內(nèi)容(包含屬性和方法)
說明:
class - 關(guān)鍵字
類名 - 程序員自己命名
????????要求:標(biāo)識(shí)符,不能是關(guān)鍵字
????????規(guī)范:駝峰式命名,并且首字母大寫;見名知義;不適用系統(tǒng)的函數(shù)名、類名、模塊名
類的說明文檔 - 用""""""引起來的說明性文字,主要說清楚類提供了哪些屬性和哪些功能
類的內(nèi)容 - 主要包含屬性和方法(定義在類中的函數(shù)叫方法)
# PEP8命名規(guī)范
student_name = '張三'
# 駝峰式命名
studentName = '李四'
# 定義一個(gè)人類
class Human:
"""人類"""
def eat(self):
print('人類在吃飯')
def sleep(self):
print('人類睡覺!')
class Servant:
"""傭人類"""
def wash(self):
print('洗衣服')
def cook(self, food):
print(f'做{food}')
3.定義對(duì)象(創(chuàng)建對(duì)象)
語法:
類名()
說明:
類名 - 是已經(jīng)定義好的類的類名
p1 = Human() # 創(chuàng)建人類的對(duì)象p1
p2 = Human()
print(p1)
print(p2)
s1 = Servant() # 創(chuàng)建傭人類的對(duì)象s1
print(s1)
s2 = Servant()
s1.wash()
s2.wash()
s1.cook('面條')
s2.cook('包子')
三、方法
1.方法(定義在類中函數(shù))
類中的方法分為三種:對(duì)象方法、類方法、靜態(tài)方法
1)對(duì)象方法
怎么定義:直接定義在類中函數(shù)就是對(duì)象方法
特點(diǎn):自帶參數(shù)self(self在通過對(duì)象調(diào)用的時(shí)候不用傳參, 系統(tǒng)會(huì)自動(dòng)將當(dāng)前對(duì)象傳給self),誰調(diào)用指向誰
怎么調(diào)用:用對(duì)象去調(diào)用(對(duì)象.方法名())
2)類方法
怎么定義: 定義函數(shù)前加裝飾器 @classmethod
特點(diǎn):自帶參數(shù)cls(cls在通過類調(diào)用的時(shí)候不用傳參,系統(tǒng)會(huì)自動(dòng)將當(dāng)前類傳給cls)
怎么調(diào)用:用類調(diào)用(類.方法名())
3)靜態(tài)方法
怎么定義: 定義函數(shù)前加裝飾器 @staticmethod
特點(diǎn):沒有默認(rèn)參數(shù)
怎么調(diào)用:用類調(diào)用
4)對(duì)象方法、類方法和靜態(tài)方法怎么選:
如果實(shí)現(xiàn)函數(shù)的功能需要用到對(duì)象的屬性,就選對(duì)象方法
class Dog:
# eat是對(duì)象方法
def eat(self):
# self = dog1
print(f'self:{self}')
print('狗啃骨頭')
# count是類方法
@classmethod
def count(cls):
# Dog能做的cls都能做
print(f'cls:{cls}')
dog2 = Dog()
dog3 = cls()
print(dog2, dog3)
print('狗的數(shù)量是: 100')
@classmethod
def func(cls):
print('類方法')
# func2是靜態(tài)方法
@staticmethod
def func2():
print('靜態(tài)方法')
# 創(chuàng)建對(duì)象
dog1 = Dog()
print(f'dog1:{dog1}')
# 用對(duì)象調(diào)用對(duì)象方法
dog1.eat()
# 用類調(diào)用類方法
Dog.count()
# 用類調(diào)用靜態(tài)方法
Dog.func2()
print('=========================注意:======================')
# 從本質(zhì)上講,類中的所有的方法都可以用對(duì)象和類調(diào)用,但是不能這么做
Dog.eat(12) # 如果用類調(diào)用對(duì)象方法,self就會(huì)變成普通的參數(shù),沒有存在的價(jià)值
dog1 = Dog()
dog1.count() # 用對(duì)象調(diào)用類方法的時(shí)候cls指向的還是類(不會(huì)指向?qū)ο?
dog1.func2()
Dog.func2()
四、init方法
1.構(gòu)造方法
構(gòu)造方法: 函數(shù)名和類名是一樣的,用來創(chuàng)建對(duì)象的方法就是構(gòu)造方法(Python中的構(gòu)造方法,在定義類的時(shí)候系統(tǒng)已經(jīng)自動(dòng)創(chuàng)建好了)
2.init方法
init方法又叫初始化方法,用來在創(chuàng)建對(duì)象的是對(duì)對(duì)象進(jìn)行初始化操作的。
當(dāng)我們通過類創(chuàng)建對(duì)象的時(shí)候,系統(tǒng)會(huì)自動(dòng)調(diào)用init方法來對(duì)象創(chuàng)建出來的對(duì)象進(jìn)行初始化。
調(diào)用構(gòu)造方法創(chuàng)建對(duì)象的時(shí)候需不需要參數(shù),需要幾個(gè),看被自動(dòng)調(diào)用的init
class Person:
def __init__(self, a, b):
print('初始化方法:', a, b)
print(f'self:{self}')
p1 = Person(10, 20)
print(p1)
# p2 = Person(a=100, b=200)
# p2 = Person()
"""
def Person(*args, **kwargs):
對(duì)象 = 申請(qǐng)空間創(chuàng)建對(duì)象
對(duì)象.__init__(*args, **kwargs)
return 對(duì)象
"""
五、對(duì)象屬性
1.屬性: 對(duì)象屬性和類屬性
對(duì)象屬性: 對(duì)象屬性的值會(huì)因?yàn)閷?duì)象不同而不一樣
a.定義在init方法中
b.以 self.屬性名 = 值
c.通過 對(duì)象.屬性名 的方式使用屬性
class Person:
def __init__(self, name1, age1, gender1='男'):
self.name = name1
self.age = age1
self.gender = gender1
def eat(self):
print(f'{self.name}吃飯')
p1 = Person('小明', 1)
print(p1.name, p1.age, p1.gender)
p2 = Person('小花', 3, '女')
print(p2.name, p2.age, p2.gender)
p2.name = '大花'
print(p2.name)
# p1.eat()
p2.eat()