1 基本理論
1.1 對象
- python 是一門特別徹底的面向?qū)ο缶幊?oop)的語言
其他語言會分為基本數(shù)據(jù)類型脓鹃,和對象類型 (如 Objective-C)。
而 python 則全部都是對象類型,包括 int float等
1.2 面向過程副瀑、面向?qū)ο?/h2>
- 兩者都是解決方法的思想
- 面向過程:在解決問題的時候舱污,關(guān)注的是解決問題的每一個過程(步驟)
- 面向?qū)ο螅涸诮鉀Q問題的時候,關(guān)注的是解決問題所需要的對象
- 面向?qū)ο蟊旧硎敲嫦蜻^程的封裝
面向過程粱栖,關(guān)注的是:功能步驟的劃分
面向?qū)ο蠡敖剑P(guān)注的是:功能步驟封裝
1.3 類
- 類指的是某一個具體對象特征的抽象
- 類的作用:根據(jù)抽象類,生產(chǎn)具體的對象
- python 中類的定義
# 定義類
class Person:
pass
# 實例化 Person
man = Person()
print(man)
# 對比函數(shù)的定義
def sum():
pass
pycharm 小技巧:
快速輸入 print(man)闹究,可以通過先敲 man.pri + tab鍵自動補(bǔ)全后則會變成前面的打印語句
2 類與對象關(guān)系
# 定義一個類
class Money:
pass
#查看類的命名 (__name__ 是 class 的屬性)
print(Money.__name__)
# xxx = Money
# print(xxx.__name__)
# 類名同時也是一個變量
Money = 666
print(Money) # 結(jié)果就是666
# # 根據(jù)這個類幔崖, 創(chuàng)建(實例化)一個對象
one = Money()
print(one) # 是一個 objc
print(one.__class__) # 打印出 Money 類
對象與類的關(guān)系
3 對象屬性操作
- 給對象添加屬性
# 1. 定義一個類
class Person:
pass
# 2. 根據(jù)類, 創(chuàng)建一個對象
p= Person()
# 3. 給p對象, 增加一些屬性
p.age = 18
p.height = 180
# 4. 驗證是否有添加成功
print(p.age)
- 刪除對象屬性赏寇,通過刪除語句
del p.age
- 查看該實例所有屬性
print(p.__dict__)
- 修改對象屬性
p.age = 100
- 給實例添加可變屬性及修改屬性
p.pets = ["小花", "小黑"]
print(p.pets, id(p.pets))
p.pets.append("小黃")
print(p.pets, id(p.pets))
# 屬性值改變后 id 不變
- 查看對象屬性
print(p.age)
- 同一類下的不同對象吉嫩,不能互相訪問屬性,即
p1 = Person()
p2 = Person()
p1.age = 18
p2.address = "上海"
print(p1.address) # 報 error嗅定,說 p1沒有address屬性
4 類屬性操作
- 類的本質(zhì)也是一個對象率挣,一般稱為類對象,那么類同樣也具有對象屬性的性質(zhì)
- 給類增加屬性1 - 通過 類名.屬性方式
class Money:
pass
Money.count = 1
Money.age = 18
print(Money.count)
# 查看類的所有屬性
print(Money.__dict__)
- 給類增加屬性2 - 在類代碼體內(nèi)添加
class Money:
age = 18
count = 1
print(Money.age)
print(Money.count)
print(Money.__dict__)
- 類屬性訪問
#方式一:通過類名直接訪問
Money.age
#方式二:通過實例對象訪問類屬性
class Money:
age = 18
one = Money()
print(one.age)
- 類屬性修改
# 只能通過類名修改
Money.age = 100
# 如果“通過實例修改類屬性”露戒,并不影響類屬性椒功,同時實例會增加一個 age 屬性
one.age = 19
print(Money.age)
print(one.__dict__) # 打印結(jié)果不包含類的屬性
python 對象屬性的查找機(jī)制
1.優(yōu)先到對象自身去查找屬性,找到結(jié)束
2.沒找到智什,則通過class找到對應(yīng)的類动漾,然后在該類里查找
對象的__class__屬性是可以被動態(tài)修改。
one.__class__ = Test
- 刪除類屬性
del Money.age
# 不能通過對象刪除荠锭,del 語句只能刪除直系屬性
- 注意
1. 只能通過類名進(jìn)行的類屬性操作:增旱眯、刪、改
可以通過類名和實例對象進(jìn)行的類屬性操作:查
2. 類屬性的內(nèi)存存儲問題
- 一般情況下证九,屬性存儲在__dict__的字典當(dāng)中删豺,有些內(nèi)置對象沒有__dict__屬性
- 一般對象可以直接修改__dict__屬性
- 但類對象的__dict__為只讀:默認(rèn)無法修改,可以通過 seattr 方法修改
3. 類屬性被各個對象共享
- 限制對象屬性的添加 __slots__
# 一般情況下愧怜,實例對象可以通過 實例.屬性名 方式動態(tài)添加無限個實例屬性呀页,
# 這種能力有時候會對抽象類造成污染,或者希望該類產(chǎn)生的實例只能添加指定名稱屬性時
# 就可以通過類屬性 __slots__ 來限制對象添加屬性
class Person:
__slots__ = ["age"]
pass
p1 = Person()
p1.age = 1
p1.num = 2 #報錯拥坛,Person object 沒有 num 屬性
面向過程粱栖,關(guān)注的是:功能步驟的劃分
面向?qū)ο蠡敖剑P(guān)注的是:功能步驟封裝
# 定義類
class Person:
pass
# 實例化 Person
man = Person()
print(man)
# 對比函數(shù)的定義
def sum():
pass
pycharm 小技巧:
快速輸入 print(man)闹究,可以通過先敲 man.pri + tab鍵自動補(bǔ)全后則會變成前面的打印語句
# 定義一個類
class Money:
pass
#查看類的命名 (__name__ 是 class 的屬性)
print(Money.__name__)
# xxx = Money
# print(xxx.__name__)
# 類名同時也是一個變量
Money = 666
print(Money) # 結(jié)果就是666
# # 根據(jù)這個類幔崖, 創(chuàng)建(實例化)一個對象
one = Money()
print(one) # 是一個 objc
print(one.__class__) # 打印出 Money 類
對象與類的關(guān)系
# 1. 定義一個類
class Person:
pass
# 2. 根據(jù)類, 創(chuàng)建一個對象
p= Person()
# 3. 給p對象, 增加一些屬性
p.age = 18
p.height = 180
# 4. 驗證是否有添加成功
print(p.age)
del p.age
print(p.__dict__)
p.age = 100
p.pets = ["小花", "小黑"]
print(p.pets, id(p.pets))
p.pets.append("小黃")
print(p.pets, id(p.pets))
# 屬性值改變后 id 不變
print(p.age)
p1 = Person()
p2 = Person()
p1.age = 18
p2.address = "上海"
print(p1.address) # 報 error嗅定,說 p1沒有address屬性
class Money:
pass
Money.count = 1
Money.age = 18
print(Money.count)
# 查看類的所有屬性
print(Money.__dict__)
class Money:
age = 18
count = 1
print(Money.age)
print(Money.count)
print(Money.__dict__)
#方式一:通過類名直接訪問
Money.age
#方式二:通過實例對象訪問類屬性
class Money:
age = 18
one = Money()
print(one.age)
# 只能通過類名修改
Money.age = 100
# 如果“通過實例修改類屬性”露戒,并不影響類屬性椒功,同時實例會增加一個 age 屬性
one.age = 19
print(Money.age)
print(one.__dict__) # 打印結(jié)果不包含類的屬性
python 對象屬性的查找機(jī)制
1.優(yōu)先到對象自身去查找屬性,找到結(jié)束
2.沒找到智什,則通過class找到對應(yīng)的類动漾,然后在該類里查找
對象的__class__屬性是可以被動態(tài)修改。
one.__class__ = Test
del Money.age
# 不能通過對象刪除荠锭,del 語句只能刪除直系屬性
1. 只能通過類名進(jìn)行的類屬性操作:增旱眯、刪、改
可以通過類名和實例對象進(jìn)行的類屬性操作:查
2. 類屬性的內(nèi)存存儲問題
- 一般情況下证九,屬性存儲在__dict__的字典當(dāng)中删豺,有些內(nèi)置對象沒有__dict__屬性
- 一般對象可以直接修改__dict__屬性
- 但類對象的__dict__為只讀:默認(rèn)無法修改,可以通過 seattr 方法修改
3. 類屬性被各個對象共享
# 一般情況下愧怜,實例對象可以通過 實例.屬性名 方式動態(tài)添加無限個實例屬性呀页,
# 這種能力有時候會對抽象類造成污染,或者希望該類產(chǎn)生的實例只能添加指定名稱屬性時
# 就可以通過類屬性 __slots__ 來限制對象添加屬性
class Person:
__slots__ = ["age"]
pass
p1 = Person()
p1.age = 1
p1.num = 2 #報錯拥坛,Person object 沒有 num 屬性