1.類的聲明
類:對擁有相同功能(方法)和相同屬性的封裝
封裝效果:一個類中可以對多個功能進(jìn)行封裝(多個函數(shù));封裝多個屬性
1.類的聲明格式
class 類名(父類列表):
類的說明文檔
類的內(nèi)容
2.說明:
class:聲明類的關(guān)鍵字
類名:標(biāo)識符,不能是關(guān)鍵字。駝峰式命名(第一個單詞首字母其他單詞首字母都大寫),首字母大寫?。?!,見名知義
例如:Person,StudentSystem
(父類列表):這個部分可以省。這個是繼承語法。
冒號:固定的
類的內(nèi)容:包括類的方法和類的屬性
3.類中的方法
方法:就是聲明在類的函數(shù)
a.對象方法:對象方法需要通過對象來調(diào)用,對象.函數(shù)名()
直接寫在;類中的方法,自帶一個self參數(shù)
b.類方法:
c.靜態(tài)方法:
4.創(chuàng)建對象
創(chuàng)建類的時候,系統(tǒng)會默認(rèn)給我們創(chuàng)建這個類對應(yīng)的構(gòu)造方法
構(gòu)造方法:類名() --->創(chuàng)建類對應(yīng)的對象
# 創(chuàng)建一個類
class Person:
"""人類 """
def eat(self):
print('人吃飯')
# 1.創(chuàng)建對象
p1 = Person() #創(chuàng)建Person類的對象,并且將對象的地址存到p1中
# 一個類可以有多個對象
p2 = Person()
# 只有在調(diào)用方法的時候才會產(chǎn)生新的對象
p3 = p2
print(id(p1),id(p2),id(p3))
#2. 調(diào)用對象方法
# 通過對象調(diào)用對象方法,默認(rèn)參數(shù)self不需要傳參。系統(tǒng)會自動傳
p1.eat()
輸出結(jié)果:
30705232 30705136 30705136
人吃飯
2.構(gòu)造方法和init方法
1.構(gòu)造方法:系統(tǒng)自動創(chuàng)建的,方法名和類名一樣。用來創(chuàng)建對象
-
init"init方法的功能是用來初始化和添加賦屬性的
當(dāng)我們通過構(gòu)造方法去創(chuàng)建對象的時候,系統(tǒng)會自動調(diào)用(不用自主調(diào)用init方法)
class Dog:
def __init__(self):
print('init方法')
class Person():
#init方法可以添加參數(shù)
def __init__(self,name,age = 18):
print(name,age)
print('人類的init方法')
# 創(chuàng)建對象的過程:調(diào)用構(gòu)造方法在內(nèi)存中開辟一個對象,
# 然后用新建的這個對象去調(diào)用init方法,來初始化對象對象的屬性。最后才將對象返回
dog1 = Dog()
#如果類的init方法有參數(shù),通過給構(gòu)造方法傳參
p1 = Person('小明')
p2 = Person('小紅',20)
輸出結(jié)果:
init方法
小明 18
人類的init方法
小紅 20
人類的init方法
3.對象屬性
類中的內(nèi)容:屬性和方法
1.屬性:(保存值的)
a.對象的屬性:不同的對象,對應(yīng)的值可能不一樣,這樣的屬性是對象屬性
類中的對象屬性是聲明在init方法中的,并且聲明格式是:self.屬性名 = 初值
對象屬性的使用:對象.屬性名
b.類的字段:屬于類的,所有的對象對應(yīng)的值是一樣的
2.方法:(保存功能的)
a.對象方法
b.類方法
c.靜態(tài)方法
class Student:
'''學(xué)生類'''
def __init__(self):
# 聲明對象屬性name,age,id
self.name = 'coco'
self.age = 0
self.id = '001'
class Dog:
'''狗類'''
#創(chuàng)建Dog的對象的時候,必須傳類型和顏色
def __init__(self,type1,color1):
self.type = type1
self.color = color1
class Computer:
'''電腦類'''
def __init__(self,color = '白色',memory = 0):
self.color = color
self.memory = memory
# 練習(xí):寫一個矩形類,擁有屬性長和寬
class Rect:
def __init__(self,long = 23,width = 20 ):
self.long = long
self.width = width
if __name__ == '__main__':
#stu1就是Student類的對象
stu1 = Student()
print(stu1.name,stu1.age,stu1.id)
#通過對象去修改對象的屬性
stu1.name = '江秀成'
print(stu1.name)
dog1 = Dog('土狗','黃色')
print(dog1.type,dog1.color)
dog2 = Dog('斗狗','黑色')
print(dog2.type,dog2.color)
comp1 = Computer()
print(comp1.color,comp1.memory)
comp2 = Computer('黑色',512)
print(comp2.color,comp2.memory)
輸出結(jié)果:
coco 0 001
江秀成
土狗 黃色
斗狗 黑色
白色 0
黑色 512
4.對象屬性的增刪改查
python 是動態(tài)語言,python中類的對象的屬性可以進(jìn)行增刪的操作
class Person:
def __init__(self):
self.name = 'jxc'
self.age = 28
self.height = 170
if __name__ == '__main__':
#1.查(獲取屬性的值)
p1 = Person()
"""
方法一:對象.屬性名
方法二:def getattr(對象, 屬性名, 默認(rèn)值)
方法三:對象.__getattribute__(屬性名)
"""
print(p1.name)
# print(p1.name2) #屬性不存在會報錯
print(getattr(p1,'name'))
print(getattr(p1,'name2',0)) #屬性不存在可以通過設(shè)置默認(rèn)值,讓程序不崩潰,并且返回默認(rèn)值
print(p1.__getattribute__('height'))
# 2.改(修改屬性的值)
"""
方法一:對象.屬性 = 新的值
方法二:def setattr(對象,屬性名,新值)
方法三:對象.__setattr__(屬性名,新值)
"""
p1.name = '李四'
setattr(p1,'age',20)
print(p1.age)
p1.__setattr__('height',160)
print(p1.height)
#3.增(添加屬性--屬性不存在)
# 注意:添加屬性只能給某一個對象添加對應(yīng)的屬性
"""
方法一:對象.屬性 = 新的值
方法二:def setattr(對象,屬性名,新值)
方法三:對象.__setattr__(屬性名,新值)
"""
p1.sex = '女'
print(p1.sex)
setattr(p1,'weight',40)
print(p1.weight)
p1.__setattr__('color','green')
print(p1.color)
# 4.刪(刪除對象屬性)
# 注意:刪除值針對指定的對象
"""
方法一:del 對象.屬性
方法二:def delattr(對象, 屬性名)
方法三:對象.__delattr__(屬性名)
"""
del p1.name
delattr(p1,'age')
p1.__delattr__('height')
輸出結(jié)果:
jxc
jxc
0
170
20
160
女
40
green
5.對象方法
1.對象方法:
a.什么樣的方法是對象方法:直接聲明在類的函數(shù)默認(rèn)是對象方法,有一個默認(rèn)參數(shù)self
b.對象方法要通過對象來調(diào)用:對象.對象方法()
c.對象方法中默認(rèn)參數(shù)self,不需要傳參。因為在調(diào)用這個方法時,系統(tǒng)會自動將當(dāng)前對象傳給self
哪個對象調(diào)用的方法,self就指向誰
練習(xí)1:寫一個矩形類,有屬性長和寬,有兩個功能,求面積和周長
class Rect:
def __init__(self,length,width):
self.length = length
self.width = width
def area(self):
return self.width*self.length
def perimeter(self):
return (self.length+self.width)*2
r1 = Rect(1, 2)
print(r1.area())
r2 = Rect(2, 3)
print(r2.perimeter())
輸出結(jié)果:
2
10
6.類的字段
類的屬性叫類的字段
a.什么是類的字段
類的字段就是聲明在類的里面,方法的外面的變量
b.什么樣的屬性聲明成類的字段:
屬于類的,對于這個類的所有的對象來說其值是共有的
c.怎么使用:
通過類來使用:類.字段
練習(xí):寫一個球類,用一個屬性來保存這個類的創(chuàng)建對象的個數(shù)
class Ball:
count = 0
# 每次創(chuàng)建球的對象都會調(diào)用init方法,所以init方法調(diào)用的次數(shù)就是Ball創(chuàng)建的對象的個數(shù)
def __init__(self):
Ball.count += 1
ball1 = Ball()
ball2 = Ball()
print(Ball.count)
if __name__ == '__main__':
# 通過類獲取類的字段的值
print(Person.number)
Person.number = 70
print(Person.number)
輸出結(jié)果:
2
7.類的方法
1.對象方法(實例方法)
聲明的形式:直接聲明在類中
特點:自帶一個不需要主動傳參的默認(rèn)參數(shù)self,誰來調(diào)用指向誰
調(diào)用:通過對象來調(diào)用
2.類方法
聲明的形式:聲明方法前需要使用@classmethod
特點:自帶一個默認(rèn)參數(shù)cls,這個參數(shù)調(diào)用的時候不需要傳值。系統(tǒng)自動給他傳。誰調(diào)用就指向誰!始終指向當(dāng)前類
調(diào)用:通過類來調(diào)用->類.類方法名()
3.靜態(tài)方法
聲明形式:聲明方法前需要使用@staticmethod說明
特點:沒有默認(rèn)的參數(shù)
調(diào)用:通過類來調(diào)用 -> 類.靜態(tài)方法()
4.遇到問題怎么來選擇使用哪種方法:
a.大前提:只要實現(xiàn)方法的功能需要用到對象的屬性,我們就使用對象方法。否則就使用靜態(tài)方法或者類方法
b.你不使用對象方法的前提下,如果實現(xiàn)功能需要用到類的字段就使用類方法
c.實現(xiàn)功能既不需要對象的屬性,又不需要類的字段就使用靜態(tài)方法
注意:靜態(tài)方法和類方法劃分不用那么嚴(yán)格,靜態(tài)方法能做的類方法可以做,反之亦然
class Person:
#類字段
number = 100
#聲明一個對象方法
def object_func(self):
print('對象方法')
# 聲明一個類方法
@classmethod
def class_func(cls):
#通過cls去使用類的字段
print('cls:',cls.number)
# 通過cls去創(chuàng)建對象
tc = cls()
tc.object_func()
print('這是一個類方法')
@staticmethod
def static_func():
print('這是一個靜態(tài)方法')
c1 = Person()
c1.object_func()
print(Person.number)
# 調(diào)用類方法
Person.class_func()
# 調(diào)用靜態(tài)方法
Person.static_func()
class Person:
# 類的字段,存儲人類的數(shù)量
number = 61
@classmethod
def shou_numer(cls):
print('人類的數(shù)量是:%d億'%cls.number)
@staticmethod
def show_numer2():
print('人類的數(shù)量是:%d億'%Person.number)