編程思想:面向過程編程叶沛;函數(shù)式編程硫眯;面向?qū)ο缶幊?/h4>
面向過程編程 -- 算法邏輯
函數(shù)式編程 -- 函數(shù)
面向?qū)ο缶幊?-- 類和對象
編程思想要逐漸往高級思想:面向?qū)ο缶幊趟枷朕D(zhuǎn)變
1.什么是類;什么是對象
類就是擁有相同屬性呵哨,相同功能的對象的集合(抽象的)
對象就是類的實例(具體的)
例:
英雄是類 蠻子就是對象赁濒;魚人也是對象
車是類 具體的某一輛車是一個對象
2.類的聲明 -- 確定類的屬性和功能是什么
1)語法
class 類名:
類的說明文檔
類的內(nèi)容
2)說明
class - 關(guān)鍵字
類名 - 要求:標識符;不能是關(guān)鍵字
規(guī)范:a.首字母大寫孟害,駝峰式命名
b.見名知義
c.不能使用系統(tǒng)提供的函數(shù)名或者類名
類的說明文檔 - 要求和函數(shù)說明文檔一樣
類的內(nèi)容 - 主要包含類的屬性和方法(方法就是聲明在類中的函數(shù))
class Person:
def eat(self, food):
print(food)
聲明對象
1)語法
對象 = 類()
p1 = Person() # p1中存儲的就是Person類的對象
p2 = Person() # 同一個類可以創(chuàng)建多個對象
1.對象方法
類中方法分為:對象方法拒炎、類方法和靜態(tài)方法
1)對象方法
a.怎么聲明 -- 直接聲明(聲明前不需要加裝飾器)在類中的函數(shù)就是對象方法
b.特點 -- 自帶self參數(shù);用對象調(diào)用對象方法的時候self不用傳參,系統(tǒng)會自動將當前對象傳給self
self可以做到誰調(diào)用就指向誰
c.怎么調(diào)用 -- 以'對象.對象方法()'的形式來調(diào)用 - 通過對象來調(diào)用對象方法
1.構(gòu)造函數(shù) - 函數(shù)名和類名一樣挨务,用來創(chuàng)建類的對象的函數(shù)
python中聲明類的時候击你,系統(tǒng)會自動為這個類創(chuàng)建一個構(gòu)造函數(shù),函數(shù)的作用是創(chuàng)建對象
構(gòu)造方法的執(zhí)行過程:a.在內(nèi)存中開辟空間創(chuàng)建對象 b.用創(chuàng)建好的對象去調(diào)用init方法
c.返回對象在內(nèi)存中的地址
# __init__方法
聲明在類中用來對對象進行初始化的方法:(當對象一創(chuàng)建出來谎柄,這個方法就會被自動調(diào)用)
注意:創(chuàng)建對象的時候過程方法需不需要傳參丁侄,需要傳幾個,看這個類的__init__方法
1.類中的屬性
屬性就是聲明在類中的變量
類中的屬性分為:字段和對象屬性
1)字段
怎么聲明 -- 聲明在類的里面函數(shù)的外面的變量就是字段
怎么使用 -- 通過類去使用(以'類.字段'的形式使用)
什么時候用 -- 屬性值不會因為對象不同而不同朝巫,這樣的屬性就聲明成類是字段
2)對象屬性:枰 !E场W炯!2诰省B洹!1涮印必逆!
怎么聲明 -- 以'self.屬性名=值'的形式聲明在init方法中
怎么使用 -- 通過對象去使用
什么時候用 -- 屬性的值可能會因為對象不同而不一樣,這樣的屬性就聲明成對象屬性
class Student:
def __init__(self):
# 這兒的name揽乱、age名眉、gender就是對象屬性
self.name = 'jack'
self.age = 19
self.gender = 'nan'
self.study_id = '001'
stu1 = Student()
stu1.age = 18
print(stu1.name, stu1.gender, stu1.age)
class Student:
def __init__(self, name, study_id, gender='boy'):
# 這兒的name、age凰棉、gender就是對象屬性
self.name = name
self.age = 19
self.gender = gender
self.study_id = study_id
stu2 = Student('lucy', '090')
print(stu2.study_id, stu2.age, stu2.gender, stu2.name)
# 聲明一個Dog類损拢,擁有屬性:名字;年齡撒犀;性別和類型
# 要求創(chuàng)建對象的時候名字福压、品種必須賦值掏秩,年齡和性別可以賦值也可以不賦值
# 擁有兩個對象方法,一個用來打印信息
# 一個交換的方法:以xxx汪汪汪的格式打印叫喚信息
class Dog:
def __init__(self, name, breed, age=2, gender='boy'):
self.name = name
self.age = age
self.gender = gender
self.breed = breed
def print_message(self):
print(self.name, self.age, self.breed, self.gender)
dog1 = Dog('jack', '牧羊犬')
dog1.print_message()
# python中類的對象的對象屬性支持增刪改查
class Person:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
p1 = Person('jack', 18, 'boy')
p2 = Person('lucy', 20, 'girl')
1.查(獲取屬性的值)
方法一:對象.屬性
方法二:getattr(對象荆姆,屬性名:str)/getattr(對象蒙幻,屬性名:str,默認值)
方法三:對象.getattribute(屬性名)
print(p1.name)
print(getattr(p1, 'age'))
print(p1.__getattribute__('gender'))
增/改
方法一:對象.屬性 = 值 #屬性存在是修改胆筒,不存在是添加
方法二:setattr(對象邮破,屬性名,值)
p1.name = 'hua'
print(p1.name)
setattr(p1, 'gender', 'boy')
print(p1.gender)
刪
方法一:del 對象.屬性
方法二:delattr(對象仆救,屬性名)
slots魔法
通過給slots字段賦值來約束當前類的對象有哪些對象屬性
1.什么是內(nèi)置類屬性
聲明類的時候系統(tǒng)自動添加的屬性(可能是字段也可能是對象屬性)
class Person:
num = 61
def __init__(self,name, gender, age):
self.name = name
self.age = age
self.gender = gender
def eat(self,food):
print('%s在吃%s' % (self.name, food))
定制當前類的對象的打印
1)重新str方法 --方法的返回值就是對應(yīng)的打印結(jié)果(類型必須是字符串)
2)重寫repr方法 -- 這個方法的返回值就是對應(yīng)的打印結(jié)果(類型必須是字符串)
p1 = Person('Jack', 'boy', 19)
1__name__
類的字段抒和;類名.name -- 獲取類的名字(字符串)
print(type(Person))
print(type(int))
print(Person.name)
2__doc__
類的字段;類.doc -- 獲取類的說明文檔
3__class__
對象屬性彤蔽;對象.class -- 獲取對象對應(yīng)的類
相當于:(type(對象))
4__dict__ --
對象屬性:對象.dict -- 將對象所有的屬性和對應(yīng)的值轉(zhuǎn)換成一個字典中的鍵值對(一個對象對應(yīng)一個字典)
類的字典:類.dict -- 將類轉(zhuǎn)換為一個字典摧莽,字典中的元素是類中所有的字段和對應(yīng)的值
'''
print(p1.dict)
print(Person.dict)
5__module__
類的字段:類.module -- 獲取當前類是在哪個模塊中聲明的(返回的是模塊的名字)
6__bases__
類的字段:類.bases -- 獲取當前類的父類(返回的是一個元組)
當我們需要在獲取屬性之前做點別的事情就需要給這個屬性添加getter
當需要給屬性賦值之前做別的事,就需要給這個屬性添加setter
給屬性添加getter
1.屬性命名時前面加'_'
2.在@property裝飾器的后面什么一個對象方法
1)將屬性去掉下劃線作為方法名
2)方法除了self以外不需要其他參數(shù)
3)函數(shù)的返回值就是獲取這個屬性的時候得到的值
3.在外面使用屬性的時候铆惑,通過’對象.不帶下劃線的屬性'去使用
7吨觥:獲取屬性值的時候,就會自動取調(diào)用getter對應(yīng)的函數(shù)
給屬性添加setter
屬性添加setter之前必須先添加getter
1.保證屬性名前有'_'
2.在@getter名.setter后面聲明對象方法
a.將屬性去掉下劃線作為方法名
b.需要一個self以外的參數(shù)
c.不需要返回值
3.在外部使用屬性的時候员魏,通過’對象.不帶下劃線的屬性'去使用
注意:當給屬性賦值的時候丑蛤,實質(zhì)是調(diào)用setter對應(yīng)的方法
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person('tony', 13)
print(p1.name, p1.age)
練習(xí):寫一個矩形類
屬性:長、寬撕阎、面積受裹、周長
要求從生活的角度看這個矩形
class Rectangle:
def __init__(self, length, wide):
self._length = length
self._wide = wide
self.area = length*wide
self.perimeter = 2*(length+wide)
@property
def length(self):
return self._length
@length.setter
def length(self, value):
if not (isinstance(value, int)) or isinstance(value, float):
raise ValueError
if value < 0:
raise ValueError
self._length = value
@property
def area(self):
self._area = self._length*self._wide
類中的方法:對象方法、類方法和靜態(tài)方法
1.對象方法
1)怎么聲明:
2)怎么調(diào)用:
3)特點:
4)什么時候用:如果實現(xiàn)函數(shù)的功能需要用到對象屬性虏束,就使用對象方法
2.類方法
1)怎么聲明:聲明在@classmethon后面
2)怎么調(diào)用:用類調(diào)用'類.類方法()'
3)特點:有自帶的參數(shù)cls棉饶,表示當前類;這個參數(shù)在調(diào)用的時候不用傳參镇匀,系統(tǒng)會自動將當前類傳給它
cls:誰調(diào)用就指向誰照藻,(如果是對象指向的是對象對應(yīng)的類)
4)什么時候用:如果實現(xiàn)函數(shù)的功能不需要對象屬性,但需要類的字段汗侵,就使用類方法
3.靜態(tài)方法
1)怎么聲明:聲明在@staticmethon后面
2)怎么調(diào)用:通過類來調(diào)用'類.靜態(tài)方法()'
3)特點:沒有默認參數(shù)
4)什么時候用:實現(xiàn)函數(shù)的功能即不需要類也不需要對象幸缕,就使用靜態(tài)方法
繼承
繼承就是讓子類直接擁有父類的屬性和方法
子類 -- 繼承者
父類/超類 -- 被繼承者
怎么繼承
class 類名(父類1,父類2晰韵,发乔。。雪猪。)
說明文檔
類的內(nèi)容
說明:
() - 固定寫法栏尚,如果省略相當于(object)
聲明類的時候如果沒有寫父類,默認繼承object(object又叫基類)
父類 - 一個類的父類可以有多個只恨,但是一般情況下只有一個(支持多繼承)