一李命,面向對象
1.什么是類(抽象)
對擁有相同屬性和方法的對象的封裝撩鹿,類中相同的屬性的值是不確定的搅方。
2.什么是對象(具體)
對象就是類的實例谬哀,對象的屬性是確定的刺覆。
3.編程的方式
- 面向過程編程:一步一步寫代碼實現(xiàn)功能--->工具:邏輯和算法
- 函數(shù)式編程:面對問題考慮有沒有擁有某種功能的函數(shù)--->工具:函數(shù)
- 面向對象編程:面對問題直接考慮是否有相應的對象來解決這個問題--->工具:類和對象
二,類
1.類的聲明
結構:
class 類名:
屬性
方法
- class :python中聲明類的關鍵字
- 類名:標識符史煎,類名的首字母大寫谦屑,駝峰式命名
- ():類如果要繼承自其他類,需要寫括號篇梭,括號里面父類的名字氢橙。
- 屬性:對象屬性和類的字段----->保存數(shù)據(jù)
- 方法:實質就是聲明在類中的函數(shù)----->實現(xiàn)類的功能
2.創(chuàng)建對象
a.通過類的構造方法去創(chuàng)建對象(名字和類名同名的方法,自動生成的)
對象名 = 類名()
b.類的對象很洋,可以使用點方法去使用類中的方法和屬性
對象.方法名() 或 對象.屬性名
3.self參數(shù)
對象方法都有一個默認參數(shù)self充蓝,在調用這個方法的時候不需要給這個參數(shù)傳參(系統(tǒng)會自動給這個參數(shù)傳參),誰來調用這個方法喉磁,self就是誰
代碼實現(xiàn):
# 1.聲明Person類
class Person:
"""
類的說明:人類
"""
# 生命兩個對象方法谓苟,需要使用對象來調用
def eat(self):
print('在吃飯')
def sleep(self):
print('在睡覺')
if __name__ == "__main__":
# 聲明對象
p1 = Person()
print(p1)
# 一個類可以有多個對象
p2 = Person()
print(p2)
# 對象可以調用對象方法
p1.eat()
p2.eat()
p1.sleep()
p2.sleep()
輸出結果:
<__main__.Person object at 0x00000221D2AA00F0>
<__main__.Person object at 0x00000221D2AA0160>
在吃飯
在吃飯
在睡覺
在睡覺
三,對象的屬性
1.對象屬性的聲明
class 類名:
def __init__(self):
self.屬性 = 初值
self.屬性2 = 初值
2.init方法
- init方法是系統(tǒng)自帶的方法协怒,這個方法不能直接調用涝焙,而是通過類創(chuàng)建對象的時候,系統(tǒng)會自動調用這個方法
- init方法的作用是對對象的屬性進行初始化
- 通過構造方法創(chuàng)建對象的時候孕暇,一定要保證init方法中除了self以外仑撞,其他每個參數(shù)都必須有值
代碼實現(xiàn):
class Person:
def __init__(self, name1='', age1=0, sex='女'):
# 在這個地方聲明對象的屬性
print('=====')
print(name1)
print(sex)
# 在init方法中聲明對象的屬性
self.name = name1
self.age = age1
self.sex = sex
if __name__ == "__main__":
# 構造方法中的參數(shù)實際上是傳遞給init方法中的參數(shù)
p1 = Person('chen', 18)
# 通過對象使用對象屬性
print(p1.name)
print(p1.age)
print(p1.sex)
# 創(chuàng)建對象的時候不給屬性賦值
p3 = Person()
p3 = Person('CHEN', sex='男')
p3 = Person(sex='男')
輸出結果:
=====
chen
女
chen
18
女
=====
女
=====
CHEN
男
=====
男
四,對象屬性的增刪查改
1.查妖滔,獲取對象的屬性
方法一:對象.屬性(當獲取的屬性不存在時會報錯)
方法二:對象.getattribute(屬性名)和 getattr(對象, 屬性名, 默認值)
2.改隧哮,修改屬性的值
方法一:對象.屬性 = 新值
方法二:對象.setattr(屬性, 新值) 和 setattr(對象, 屬性名, 新值)
3.增,增加對象屬性
對象.屬性(這個屬性之前不存在)
注意:這個屬性是添加給對象的座舍,而不是類>谙琛!曲秉!
4.刪采蚀,刪除對象屬性
del 對象.屬性
注意:刪除的是對象的屬性疲牵,不會影響這個類的其他對象
代碼實現(xiàn):
"""---chen---"""
class Dog:
"""狗類"""
def __init__(self, age1=0, color1='red'):
self.age = age1
self.color = color1
if __name__ == "__main__":
dog1 = Dog(age1=2, color1='white')
# 1.查,獲取屬性
"""
方法一:對象.屬性(查找的時候如果屬性不存在榆鼠,會報錯)
方法二:對象.__getattribute__(屬性名)和 getattr(對象, 屬性名, 默認值)
"""
print(dog1.age, dog1.color)
print(dog1.__getattribute__('age'))
print(getattr(dog1, 'age'))
# 如果設置了default的值纲爸,那么當屬性不存在的時候不會報錯,并且返回默認值
print(getattr(dog1, 'abc', None))
# 2.改妆够,修改屬性的值
"""
方法一:對象.屬性 = 新值
方法二:對象.__setattr__(屬性, 新值) 和 setattr(對象, 屬性名, 新值)
"""
dog1.age = 3
print(dog1.age)
dog1.__setattr__('color', 'black')
print(dog1.color)
setattr(dog1, 'color', 'blue')
print(dog1.color)
# 3.增识啦,增加對象屬性
"""
對象.屬性(這個屬性之前不存在)
注意:這個屬性是添加給對象的,而不是類T鹁病T摹!
"""
dog1.name = '大黃'
print(dog1.name)
dog1.__setattr__('type', '哈士奇')
print(dog1.type)
setattr(dog1, 'sex', '公狗')
print(dog1.sex)
# dog2 = Dog()
# print(dog2.name)
# 4.刪灾螃,刪除對象屬性
"""
del 對象.屬性
注意:刪除的是對象的屬性,不會影響這個類的其他對象
"""
# del dog1.age
# print(dog1.age) AttributeError: 'Dog' object has no attribute 'name'
# dog1.__delattr__('age')
delattr(dog1, 'age')
# print(dog1.age)
輸出結果:
2 white
2
2
None
3
black
blue
大黃
哈士奇
公狗
六揩徊,slots和str
_slots的作用:約束類中的對象屬性
_str的作用:自定義對象的打印格式
代碼實現(xiàn):
class Person:
# __slots__的功能:約束類中的對象屬性
__slots__ = ('name', 'age', 'sex')
def __init__(self, name='', age=0):
self.name = name
self.age = age
# self.tel = 123 AttributeError: 'Person' object has no attribute 'tel'
# 自定義對象的打印格式
def __str__(self):
return '人類'
輸出結果:
人類
七腰鬼,類中的方法
1.屬性的分類
- 對象的屬性
對象屬性是屬于對象的,不同的對象對應的值可能不一樣塑荒。對象屬性熄赡,通過對象來使用 - 類的屬性(字段)
類的屬性聲明在類里面,函數(shù)外面齿税。類屬性屬于類彼硫,通過類來使用
2.方法的分類
- 對象方法
對象方法自帶一個self參數(shù),一般通過對象去調用 - 類方法
類方法使用@classmethod修飾 凌箕。自帶一個cls參數(shù)拧篮,這個參數(shù)不用傳參,誰來調用這個方法牵舱,cls就指向誰串绩。類方法要通過類來調用 - 靜態(tài)函數(shù)
靜態(tài)函數(shù)使用@staticmethod修飾 ,沒有默認參數(shù) 芜壁,靜態(tài)方法要通過類來調用
3.方法的選擇
- 如果實現(xiàn)函數(shù)的功能需要使用對象的屬性礁凡,就是用對象方法;
- 如果實現(xiàn)函數(shù)的功能需要使用字段或者調用類的方法慧妄,就是聲明成對象方法顷牌;
- 如果實現(xiàn)函數(shù)功能既不需要對象屬性,也不需要類的字段塞淹,就聲明成靜態(tài)方法窟蓝。
代碼實現(xiàn):
class Person:
# number是類屬性
number = 0
def __init__(self, name='', age=0):
# name 和 age 都是對象屬性
self.name = name
self.age = age
# eat方法是對象方法
def eat(self, food):
print('%s在吃%s' % (self.name, food))
# hurt_earth就是一個類方法
@classmethod
def hurt_earth(cls):
# cls指向的是Person,cls可以當成類來使用
pt = cls('張三') # 可以使用cls創(chuàng)建類的對象
print(pt.name)
print(cls.number) # 也可以使用cls使用類的字段
print('人類破壞環(huán)境!窖铡!')
# protect_earth是一個靜態(tài)方法
@staticmethod
def protect_earth():
print('人類保護地球A迫瘛坊谁!')
if __name__ == "__main__":
# 類字段要通過類來使用
print(Person.number)
# 對象的屬性通過對象來使用
p1 = Person('小明')
print(p1.name, p1.age)
# 對象方法對象調用
p1.eat('面條')
p2 = Person('小紅')
p2.eat('火鍋')
# 類方法通過類來調用
Person.hurt_earth()
# 靜態(tài)方法通過類來調用
Person.protect_earth(
輸出結果:
0
小明 0
小明在吃面條
小紅在吃火鍋
張三
0
人類破壞環(huán)境!滑臊!
人類保護地球?谏帧!