一凉逛、類和對象:
1.理論上的定義
類:就是擁有相同功能和相同屬性的對象的集合(類是抽象)
對象:類的實例(對象是具體的)
2.從生活角度
如果說人是一個類兔簇,余婷就是一個對象哲身,肖老師是另外一個對象审丘,馬云也是人這個類的對象
如果說電腦是一個類嵌屎,我桌上的這臺電腦就是一個對象
如果說車是一個類誉裆,具體的一輛車才是它的對象
3.編程思想
面向過程編程:以算法為工具
函數式編程:以函數為工具
面向對象編程:以類和對象為工具(面向生活)
二顿颅、內的聲明:
類:對擁有相同功能(方法)和相同屬性(屬性)的封裝
封裝效果:一個類中可以對多個功能進行封裝(多個函數);封裝多個屬性
1.類的聲明格式
class 類名(父類列表):
類的說明文檔
類的內容
2.說明:
class: 聲明類的關鍵字
類名: 標識符足丢,不能是關鍵字粱腻。駝峰式命名(第一個單詞首字母小寫其他的單詞首字母都大寫),首字母大寫U兜I苄!耀鸦,見名知義
例如:Person柬批、StudentSystem
(父類列表): 這個部分可以省。 這個是繼承語法袖订,可以多繼承
冒號:固定的
類的內容:包括類的方法和類的屬性
3.類中的方法
方法:就是聲明在類的函數
a.對象方法:對象方法需要通過對象來調用氮帐,對象.函數名()
直接寫在類中的方法,自帶一個self參數
b.類方法
c.靜態(tài)方法
4.創(chuàng)建對象
創(chuàng)建類的時候洛姑,系統(tǒng)會默認給我們創(chuàng)建這個類對應的構造方法
構造方法: 類名() --> 創(chuàng)建類對應的對象
# 創(chuàng)建一個類
class Person:
def eat(self):
print('人吃飯')
三上沐、構建方法和init方法:
1.構造方法:系統(tǒng)自動創(chuàng)建的,方法名和類名一樣楞艾。用來創(chuàng)建對象
2.init: init方法的功能是用來做初始化和添加對象屬性的
當我們通過構造方法去創(chuàng)建對象的時候参咙,系統(tǒng)會自動調用init方法(不用主動調用init方法)
class Dog:
def __init__(self):
print('init方法')
class Person:
# init方法可以添加參數
def __init__(self, name, age=18):
print(name, age)
print('人類的init方法')
創(chuàng)建對象的過程:調用構造方法在內存中開辟空間創(chuàng)建一個對象龄广,然后用新建的這個對象去調用init方法,
來初始化對象的屬性昂勒。最后才將對象返回
四蜀细、對象屬性:
類中的內容:屬性和方法
1.屬性:(保存值的)
a.對象的屬性:不同的對象,對應的值可能不一樣戈盈,這樣的屬性是對象屬性。屬于對象
類中的對象屬性是聲明在init方法中的谆刨,并且聲明格式是:self.屬性名 = 初值
對象屬性的使用:對象.屬性名
b.類的字段:屬于類的塘娶,所有的對象對應的值是一樣的
2.方法:(保存功能的)
a.對象方法
b.類方法
c.靜態(tài)方法
class Student:
"""學生類"""
def __init__(self):
# 聲明對象屬性name, age, id
self.name = '張三'
self.age = 0
self.id = '001'
class Dog:
"""狗類"""
# 創(chuàng)建Dog的對象的時候,必須傳類型和顏色
def __init__(self, type1, color1):
self.type = type1
self.color = color1
class Computer:
"""電腦類"""
# 創(chuàng)建對象的時候痊夭,可以讓屬性使用默認值刁岸,也可以使用自己傳的值
def __init__(self, color1='白色', memory1=0):
self.color = color1
self.memory = memory1
練習:寫一個矩形類,擁有屬性長和寬
class Rectangle:
def __init__(self, length, width):
self.length = length
self.width = width
五她我、對象屬性的增刪改:
python是動態(tài)語言虹曙,python中類的對象的屬性可以進行增刪的操作
class Person:
"""人類"""
def __init__(self, name1='張三'):
self.name = name1
self.age = 18
self.height = 160
p1 = Person()
p2 = Person()
1.查(獲取屬性的值)
方法一: 對象.屬性
方法二: def getattr(對象, 屬性名, 默認值)
方法三:對象.getattribute(屬性名)
print(getattr(p1, 'age2')) # 屬性不存在會報錯
print(getattr(p1, 'age2', 0)) # 屬性不存在可以通過設置默認值,讓程序不崩潰番舆,并且返回默認值
2.改(修改屬性的值,屬性值存在)
方法一:對象.屬性 = 新值
方法二: def setattr(對象,屬性名, 新值)
方法三: 對象.setattr(屬性名, 新值)
p1.name = '李四'
setattr(p1, 'age', 20)
print(p1.age)
p1.__setattr__('height', 170)
print(p1.height)
3.增(添加屬性 -- 屬性不存在)
方法一:對象.屬性 = 值
方法二: def setattr(對象,屬性名, 值)
方法三: 對象.setattr(屬性名, 值)
4.刪(刪除對象屬性)
注意:刪除值針對指定的對象
方法一: del 對象.屬性
方法二:delattr(對象, 屬性名)
方法三: 對象.delattr(屬性名)
del p1.name
print(p1.name)
delattr(p1, 'age')
print(p1.age)
p1.__delattr__('height')
print(p1.height)
print(p2.name, p2.age)
六酝碳、對象的方法
1.對象方法:
a.什么樣的方法是對象方法:直接聲明在類的函數默認是對象方法,有一個默認參數self
b.對象方法要通過對象來調用:對象.對象方法()
c.對象方法中默認參數self,不需要傳參恨狈。因為在調用這個方法的時候系統(tǒng)會自動將當前對象傳給self疏哗。
哪個對象調用的方法,self就指向誰
import math
class Circle:
def __init__(self, radius1):
self.radius = radius1
聲明一個對象方法area
在這兒禾怠,self就是調用area方法的對象返奉。對象能做的事情,self都可以做
def area(self):
# print(id(self))
# print(self.radius)
# self.radius = 100
# print('求圓的面積')
return math.pi * (self.radius ** 2)
練習1:寫一個矩形類吗氏,有長和寬芽偏,有兩個功能,分別是求周長和面積
class Rectangle:
def __init__(self, length1, width1):
self.length = length1
self.width = width1
練習2:寫一個班級類弦讽,班級里面有多個學生的成績(一門)污尉,班級名, 可以獲取班級成績中的最高分
class Class:
"""班級類"""
def __init__(self, name):
self.scores = []
self.name = name
def highest_score(self):
if not self.scores:
return 0
# max(序列) ---> 獲取序列中元素的最大值
# min(序列) ---> 獲取序列中元素的最小值
return max(self.scores)
class1 = Class('python1806')
class1.scores = [23, 45, 77, 54, 89, 90, 34]
print(class1.highest_score())
七、類 的字段:
1.類的屬性叫類的字段
a.什么是類的字段:
類的字段就是聲明在類的里面坦袍,方法的外面的變量
b.什么樣的屬性聲明成類的字段:
屬于類的十厢,對于這個類的所有的對象來說其值是共有的
c.怎么使用:
通過類來使用: 類.字段
class Person:
# 這個number就是類的字段
number = 61
練習:寫一個球類,用一個屬性來保存這個類的創(chuàng)建對象的個數
class Ball:
count = 0
# 每次創(chuàng)建球的對象都會調用init方法捂齐,所以init方法調用的次數就是Ball創(chuàng)建的對象的個數
def __init__(self):
Ball.count += 1
ball1 = Ball()
ball2 = Ball()
print(Ball.count)
八蛮放、 類的方法:
類中的方法:
1.對象方法(實例方法)
聲明的形式:直接聲明在類型
特點:自帶一個不需要主動傳參的默認參數self, 誰來調用指向誰
調用:通過對象來調用
2.類方法
聲明的形式:聲明方法前需要使用@classmethod說明
特點:自帶一個默認參數cls,這個參數調用的時候不需要傳值奠宜。系統(tǒng)自動給他傳包颁。誰調用就指向誰瞻想!,始終指向當前類
調用:通過類來調用 -> 類.類方法()
3.靜態(tài)方法
聲明的形式:聲明方法前需要使用@staticmethod說明
特點: 沒有默認的參數
4.遇到問題怎么來選擇使用哪種方法:
a.只要實現方法的功能需要用到對象的屬性娩嚼,我們就使用對象方法
b.不使用對象方法的前提下蘑险,如果實現功能需要用到類的字段就使用類方法
c.實現功能既不需要對象的屬性,又不需要類的字段就使用靜態(tài)方法
注意:靜態(tài)方法和類方法劃分不用那么嚴格岳悟,靜態(tài)方法能做的類方法可以做佃迄,反之亦然
class Person:
# 類的字段,存儲人類的數量
number = 61
@classmethod
def show_numer(cls):
print('人類的數量是:%d億' % cls.number)
@staticmethod
def show_numer2():
print('人類的數據是:%d億贵少!' % Person.number)