01-類和對象
1.理論上的定義
類:就是擁有相同功能和相同屬性的對象的集合 (類是抽象)
對象:類的實(shí)例(對象是具體的)
2.從生活的角度
如果說人是一個類翩概,馬云就是一個對象
如果說電腦是一個類,我桌上的這臺電腦就是一個對象
如果說車是一個類嗽测,具體的一輛車就是一個對象
3.編程思想
面向過程編程:以算法為工具
函數(shù)式編程:以函數(shù)為工具
面向?qū)ο缶幊蹋阂灶惡蛯ο鬄楣ぞ撸嫦蛏睿?/p>
02-類的聲明
類:對擁有相同功能(方法)和相同屬性(屬性)的封裝
封裝效果:一個類中可以對多個功能進(jìn)行封裝(多個函數(shù))糟趾,對多個屬性進(jìn)行封裝
1.類的聲明格式
class 類名(父類列表):
——類的說明文檔
——類的內(nèi)容
2說明:
class:聲明類的關(guān)鍵字
類名:標(biāo)識符洗做,不能是關(guān)鍵字燎竖。駝峰式命名(第一個單詞首字母小寫楼入,其它的單詞首字母大寫)哥捕,首字母大寫!<涡堋遥赚!,見名知義
例如:Person阐肤、StudentSystem
(父類列表):括號與括號里的內(nèi)容可以省略凫佛,這個是繼承語法
冒號:固定的
類的內(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('人吃飯')
if __name__ == '__main__':
# 創(chuàng)建對象
p1 = Person() # 創(chuàng)建Person類的對象衫画,并且將對象地址存到p1中
# 一個類可以有多個對象
p2 = Person()
# 只有在調(diào)用構(gòu)造方法的時候才會產(chǎn)生新的對象
p3 = p2
print(id(p1),id(p2),id(p3))
# 2.調(diào)用對象
# 通過對象調(diào)用對象方法毫炉,默認(rèn)參數(shù)self不需要傳參,系統(tǒng)自動傳參
p1.eat()
03-構(gòu)造方法和init方法
1.構(gòu)造方法:系統(tǒng)自動創(chuàng)建削罩,方法名和類名一樣瞄勾,用來創(chuàng)建對象
2.init:init方法的功能是用來做初始化和添加對象屬性的
當(dāng)我們通過構(gòu)造方法去創(chuàng)建對象的時候,系統(tǒng)會自動調(diào)用init方法(不用主動調(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方法')
if __name__ == '__main__':
# 創(chuàng)建對象的過程:調(diào)用構(gòu)造方法在內(nèi)存中開辟空間創(chuàng)造一個對象弥激,然后用新建的這個對象去調(diào)用init方法进陡,
# 來初始化對象的屬性,最后才將對象返回
dog1 = Dog()
dog2 = Dog()
# 如果類的init方法有參數(shù)秆撮,通過給構(gòu)造方法傳參類init方法傳參
p1 = Person('小明')
p2 = Person('小紅',20)
p3 = Person(age = 20,name = '東東')
04-對象屬性
類中的內(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 = '李青'
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)建對象的時候可以使用默認(rèn)值喳资,也可以使用自己傳的值
def __init__(self,color= '白色',memory= 0):
self.color = ''
self.memory = 1000
class rectangle:
def __init__(self,long= 100,width= 50):
self.long = long
self.width = width
if __name__ == '__main__':
# stu1就是Student類的對象
stu1 = Student()
# 通過對象去使用對象的屬性
print(stu1.name,stu1.age,stu1.id)
# 通過對象去修改對象的屬性
stu1.name = 'SB'
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)
sq = rectangle()
print(sq.long,sq.width)
sq = rectangle(10,5)
print(sq.long,sq.width)
05-對象屬性的增刪改查
Python是動態(tài)語言觉吭,Python中類的對象的屬性可以進(jìn)行增刪的操作
class Person:
'''人類'''
def __init__(self):
self.name = '李四'
self.age = 18
self.height = 160
1.查
方法一:對象.屬性
方法二:def getattr(對象,屬性名仆邓,default=None)
方法三:對象._ getattribute _('height')
print(p1.name)
# print(p1.nmae2) # 屬性不存在會報錯
print(getattr(p1,'age2',0)) # 屬性不存在可以通過設(shè)置默認(rèn)值鲜滩,讓程序不崩潰,并且返回默認(rèn)值
height = p1.__getattribute__('height')
print(height)
2.改(修改屬性的值节值,屬性存在)
方法一:對象.屬性 = 新值
p1.name = '張三'
print(p1.name)
方法二:def setattr(對象徙硅,屬性名,新值)
setattr(p1,'age',20)
print(p1.age)
方法三:對象._ setattr _(屬性名搞疗,新值)
p1.__setattr__('height',170)
print(p1.height)
3.增(增加屬性)
注意:添加只能給某一個對象添加對應(yīng)的屬性
方法一:對象.屬性 = 新值
p1.sex = '女'
print(p1.sex)
方法二:def setattr(對象嗓蘑,屬性名,新值)
setattr(p1,'weight',55)
print(p1.weight)
方法三:對象.setattr(屬性名匿乃,新值)
p1.__setattr__('color', '綠色')
print(p1.color)
# print(p2.sex) # 添加只影響一個對象
4.刪(刪除對象屬性)
注意:刪除只針對指定的對象
方法一:del 對象.屬性
del p1.name
# print(p1.name) 可行
方法二:delattr(對象桩皿,屬性名)
delattr(p1,'age')
# print(p1.age) 可行
方法三:對象._ delattr _(屬性名)
p1.__delattr__('height')
# print(p1.height) 可行
print(p2.name,p2.age)
06-對象方法
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就指向誰
import math
class Circle:
'''圓類'''
def __init__(self,radius1):
self.radius = radius1
# 聲明了一個對象方法area
# 在這佛嬉,self就是調(diào)用area方法的對象,對象能做的事情岩调,self都可以做
def area(self):
# print(id(self))
# print('求圓的面積')
return math.pi * self.radius **2
- 練習(xí)1:寫一個矩形類巷燥,有屬性長和寬,有兩個功能赡盘,分別是求周長和面積
class Rectangle:
'''矩形類'''
def __init__(self,long,width):
self.long = long
self.width =width
# 對象方法是否需要額外參數(shù)号枕,看實(shí)現(xiàn)函數(shù)的功能需不需要除了對象屬性以外的其他數(shù)據(jù)
def area(self):
return self.long * self.width
def perimeter(self):
return (self.width + self.long) *2
- 練習(xí)2:寫一個班級類,班級里面有多個學(xué)生的一門成績陨享,班級名葱淳,可以獲取班級成績中的最高分
class Grade:
'''班級類'''
def __init__(self,class_name,*grade):
self.class_name = class_name
self.grade = grade
# self.grade = []
def top_score(self):
# if not self.grade:
# return None
# max(序列)----》獲取序列中元素的最大值
# min (序列)----》獲取序列中元素的最小值
return max(self.grade)
if __name__ == '__main__':
c1 = Circle(3)
print(id(c1))
print('c1的面積',c1.area())
c2 = Circle(5)
print('c2的面積', c2.area())
g1 = Grade('python1806',90,80,70)
print(g1.class_name)
print(g1.top_score())
g2 = Rectangle(10,5)
print(g2.area())
print(g2.perimeter())
07-類的字段
1.類的屬性叫類的字段
a.什么是類的字段
類的字段就是聲明在類的里面,方法的外面的變量
b.什么樣的屬性聲明成類的字段:
屬于類的抛姑,對于這個類的所有的對象來說赞厕,其值是一樣的
c.怎么使用
通過類使用:類.字段
class Person:
# number就是類的字段
number = 10
練習(xí):寫一個球類,用一個屬性來保存這個類的創(chuàng)建對象的個數(shù)
class Ball:
count = 0
# 每次創(chuàng)建球的對象都會調(diào)用init方法定硝,所以調(diào)用init方法的次數(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)
08-類的方法
類中的方法
- 1.對象方法(實(shí)例方法)
聲明的形式:直接聲明在類中
特點(diǎn):自帶一個不需要主動傳參的默認(rèn)參數(shù)self皿桑,誰來調(diào)用指向誰 - 2.類方法
聲明形式:聲明方法前需要使用@classmethod
特點(diǎn):自帶一個參數(shù)cls,這個參數(shù)調(diào)用的時候不需要傳值,系統(tǒng)自動傳值,誰調(diào)用诲侮,傳給誰镀虐!始終指向當(dāng)前類
調(diào)用:通過類調(diào)用---》類.類方法() - 3.靜態(tài)方法
聲明的形式:聲明方法前需要使用@staticmethod說明
特點(diǎn):沒有默認(rèn)參數(shù)
調(diào)用:通過類來調(diào)用--》類.靜態(tài)方法()
class Class1:
# 類字段
number = 10
# 聲明一個對象方法
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 = Class1()
# 調(diào)用對象方法
c1.object_func()
print(Class1.number)
# 調(diào)用類方法
Class1.class_func()
# 調(diào)用靜態(tài)方法
Class1.static_func()
4.遇到問題怎么來選擇使用那種方法:
- a.大前提:只要實(shí)現(xiàn)方法的功能需要用到對象的屬性,我們就使用對象方法沟绪,否則就使用靜態(tài)方法或者類方法
- b.不使用對象方法的前提下刮便,如果實(shí)現(xiàn)功能需要類的字段就使用類方法
- c.實(shí)現(xiàn)功能既不需要對象的屬性,又不需要類的字段就使用靜態(tài)方法
注意:靜態(tài)方法和類方法劃分不嚴(yán)格绽慈,靜態(tài)方法能做的恨旱,類方法可以做,反之成立
class Person:
# 類的字段坝疼,存儲人類數(shù)量
number = 61
@classmethod
def show_number1(cls):
print('人類的數(shù)量是:%d億'% cls.number)
@staticmethod
def show_number2():
print('人類的數(shù)量是:%d億'% Person.number)
Person.show_number1()
Person.show_number2()