13.1 編程思想
- 1.編程思想:
1.面向過程編程 - 邏輯貌亭、算法
遇到問題考慮直接把邏輯思維轉(zhuǎn)換成代碼,解決問題
2.函數(shù)式編程 - 函數(shù)
遇到問題想到用函數(shù)解決认臊∑酝ィ考慮是否有這種功能的函數(shù)。
3.面向?qū)ο缶幊?- 類和對(duì)象
遇到問題失晴,就考慮是否有一個(gè)對(duì)象能幫我解決這個(gè)問題
- 2.類和對(duì)象
1.定義
類:就是擁有相同屬性和功能的對(duì)象的集合(類是抽象的)
對(duì)象:類的實(shí)例(對(duì)象是具體的)
2.從生活的角度考慮類的對(duì)象
如果‘人’是一個(gè)類剧腻,余婷是一個(gè)對(duì)象,駱老師也是一個(gè)對(duì)象涂屁。
13.2 類的聲明
- 1.類的聲明
語法:
class 類名(父類列表):
類的內(nèi)容
說明:
class - 聲明類的關(guān)鍵字
類名 - 標(biāo)識(shí)符书在,不能是關(guān)鍵字;采用駝峰式命名拆又,并且首字母大寫儒旬;見名知義。
(父類列表) - 繼承語法帖族;可以省略栈源,省略時(shí)相當(dāng)于(objct)即基類(祖宗類)。
類的內(nèi)容 - 主要包含屬性和方法
補(bǔ):駝峰式命名:名字由多個(gè)單詞組成竖般,通過單詞首字母大寫來區(qū)分不同的單詞甚垦。
方法:python中聲明在類中的函數(shù)叫方法。
- 2.類的屬性和方法
類中的屬性 - 指的是在類中聲明的變量涣雕;分為類的字段和對(duì)象屬性
類中的方法 - 指的是在類中聲明的函數(shù)艰亮;分為對(duì)象方法,類方法和靜態(tài)方法挣郭。
# 聲明了一個(gè)Person類
class Person:
"""人類"""
num = 61 # 類的字段
age = 61 # 對(duì)象屬性
name = 123
# 方法
def eat(self):
print('%s在吃飯垃杖。' % Person.name)
# Person是類(類就是類型)
print(Person) # <class '__main__.Person'>
- 3.創(chuàng)建對(duì)象
類名()- 創(chuàng)建類對(duì)應(yīng)的對(duì)象
xiao_ming = Person()
# 創(chuàng)建Person類的對(duì)象xiao_ming
print(xiao_ming) # <__main__.Person object at 0x000001D82796B8D0>
xiao_ming.eat() # 123在吃飯。
print(xiao_ming.name) # 123
12.3 對(duì)象方法
- 1.什么是對(duì)象方法
直接聲明在類中丈屹,并且自帶一個(gè)叫self的參數(shù)的函數(shù)调俘,就是對(duì)象方法伶棒。 - 2.對(duì)象方法的調(diào)用 - 通過對(duì)象調(diào)用對(duì)象方法
對(duì)象.對(duì)象方法() - 3.self(當(dāng)前對(duì)象)
通過對(duì)象調(diào)用對(duì)象方法時(shí),對(duì)象方法中第一個(gè)參數(shù)self不用傳參彩库,系統(tǒng)會(huì)自動(dòng)將當(dāng)前對(duì)象傳給self肤无。哪個(gè)對(duì)象調(diào)用的self就指向誰。
注意:
當(dāng)前類的對(duì)象能做的事情骇钦,self都能做宛渐。
# 創(chuàng)建一個(gè)Person類
class Person:
"""人類"""
def __init__(self):
self.name = ''
# 聲明了一個(gè)對(duì)象方法sleep
def sleep(self):
print('self', self)
print('%s睡覺!' % self.name)
self.run() # 對(duì)象能做的眯搭,self都能做窥翩;當(dāng)前對(duì)象
def run(self):
print('跑')
# 創(chuàng)建person對(duì)象p1
p1 = Person()
print('p1', p1) # p1 <__main__.Person object at 0x0000017DADA7B4E0>
p1.sleep() # self <__main__.Person object at 0x0000017DADA7B4E0>
p2 = Person()
p2.name = '小花'
p2.sleep() # 小花睡覺! 跑
12.4 init方法和構(gòu)造方法
0.魔法方法:python類中鳞仙,用__開頭及結(jié)尾的方法寇蚊,就是魔法方法,魔法方法不需要主動(dòng)調(diào)用棍好,都會(huì)自動(dòng)調(diào)用仗岸。
1._init_方法
a.是對(duì)象方法,可用對(duì)象調(diào)用
b.不需要自己調(diào)用借笙,會(huì)被自動(dòng)調(diào)用
c.在創(chuàng)建對(duì)象后扒怖,專門用來對(duì)對(duì)象做初始化。2.構(gòu)造方法
概念:函數(shù)名和類名一樣的函數(shù)业稼,就是構(gòu)造方法盗痒。用于創(chuàng)建對(duì)象。
當(dāng)我們創(chuàng)建類時(shí)低散,系統(tǒng)會(huì)自動(dòng)創(chuàng)建這個(gè)類的構(gòu)造方法俯邓,用來創(chuàng)建對(duì)象。
當(dāng)我們通過構(gòu)造方法創(chuàng)建對(duì)象時(shí)谦纱,系統(tǒng)會(huì)自動(dòng)調(diào)用init方法來對(duì)創(chuàng)建好的對(duì)象進(jìn)行初始化看成。
注意:
當(dāng)init方法中除了self以外如果需要?jiǎng)e的參數(shù),那么這些參數(shù)是通過構(gòu)造方法傳入的跨嘉。
只要調(diào)用了構(gòu)造方法川慌,就會(huì)產(chǎn)生新的對(duì)象。想要對(duì)象祠乃,就要用構(gòu)造方法梦重。
class Person(object):
def __init__(self, name, age=0):
print('self', self)
print('init方法', name)
"""
def Person(*args, **kwargs):
在堆中開辟空間創(chuàng)建對(duì)象
對(duì)象.__init__(*args, **kwargs)
return 對(duì)象
"""
p0 = Person('abc', 10)
p1 = Person('abc', 10)
print('p1:', p1)
p2 = Person('123', age=20)
print('p2:', p2)
# p3 = Person()
p3 = p1
# 模擬構(gòu)造方法和init方法
def __init__(a, b):
print('自己實(shí)現(xiàn)', a, b)
def Person1(*args, **kwargs):
# args = (10, 20)
print('創(chuàng)建對(duì)象')
__init__(*args, **kwargs)
print('返回對(duì)象')
Person1(10, 20)
# 注意
tuple1 = (10, 20)
print(*tuple1) # 10 20
13.5 對(duì)象屬性
- 1.什么是對(duì)象屬性
a.聲明在_init_方法中
b.self.屬性名 = 值
c.通過對(duì)象使用: 對(duì)象.屬性
d.不同的對(duì)象,屬性可能不一樣
語法:
self.變量名 = 值
說明:變量名就是屬性名,這個(gè)變量就是對(duì)象屬性
- 2.什么樣的屬性應(yīng)該聲明成對(duì)象的屬性
如果屬性值會(huì)因?yàn)閷?duì)象不同而不一樣,那這樣的屬性就應(yīng)該聲明成對(duì)象屬性.反之聲明成類的字段.
# 情況1:所有對(duì)象屬性創(chuàng)建時(shí)都使用一個(gè)固定的默認(rèn)值
class Person:
def __init__(self):
# 這里的name和age就是Person類的對(duì)象屬性.
self.name = ''
self.age = 0
# 創(chuàng)建對(duì)象
p1 = Person()
# 使用對(duì)象屬性
p1.name = 'ZH'
print(p1.name) # ZH
print(p1.age) # 0
p2 = Person()
p2.name = 'Z'
print(p1.name) # ZH
print(p2.name) # Z
print(p1.age) # 0
print('='*88)
# 情況2:創(chuàng)建對(duì)象時(shí),決定對(duì)象屬性值
class Person:
def __init__(self, name, age=1):
# 這里的name和age就是Person類的對(duì)象屬性.
self.name = name
self.age = age
# 創(chuàng)建對(duì)象
p1 = Person('ZH')
# 使用對(duì)象屬性
# p1.name = 'ZH'
print(p1.name) # ZH
print(p1.age) # 1
p2 = Person('Z')
# p2.name = 'Z'
print(p1.name) # ZH
print(p2.name) # Z
print(p1.age) # 1
# 修改對(duì)象屬性值
p1.name = '流浪法師'
print(p1.name) # '流浪法師'
# 練習(xí),聲明一個(gè)矩形類
"""
屬性:長和寬
方法:求面積和求周長
"""
class Retangle:
def __init__(self, length, width):
self.length = length
self.width = width
# 一個(gè)對(duì)象方法,需不需要除了self以外的其他參數(shù),看實(shí)現(xiàn)這個(gè)函數(shù)的功能需不需要除
# 了屬性以外的其他數(shù)據(jù).
def area(self):
return self.width*self.length
def perimeter(self):
return (self.width+self.length)*2
j1 = Retangle(30, 20)
print(j1.area()) # 600
print(j1.perimeter()) # 100
# 練習(xí):聲明一個(gè)point類,擁有屬性x,y坐標(biāo).擁有的功能是求一個(gè)點(diǎn)到另一個(gè)點(diǎn)的距離
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
# def distance(self, x1, y1):
# return ((self.x-x1)**2 + (self.y-y1)**2)**0.5
def distance(self, other):
return ((self.x-other.x)**2 + (self.y-other.y)**2)**0.5
p1 = Point(1, 2)
p2 = Point(4, 6)
# p1_p2 = p1.distance(p2.x, p2.y)
# print(p1_p2) # 5.0
print(p1.distance(p2)) # 5.0
13.6 對(duì)象屬性的增刪改查
class Dog:
def __init__(self, name, color, type):
self.name = name
self.color = color
self.type = type
dog1 = Dog('旺財(cái)', '黃色', '二哈')
- 1.查(獲取對(duì)象屬性的值)
獲取指定對(duì)象指定的屬性
a.對(duì)象.屬性名 - 屬性不存在時(shí)會(huì)報(bào)錯(cuò)
b.getattr(對(duì)象,'屬性名',默認(rèn)值) - 當(dāng)屬性不存在時(shí),如果設(shè)置了默認(rèn)值,不會(huì)崩潰,會(huì)返回默認(rèn)值.
print(dog1.name) # 旺財(cái)
# print(dog1.name1) # AttributeError: 'Dog' object has no attribute 'name1'
print(getattr(dog1, 'name')) # 旺財(cái)
print(getattr(dog1, 'name1', '菜菜')) # 菜菜
- 2.增\改
a.對(duì)象.屬性 = 值
b.setattr(對(duì)象,屬性名,值)
注意:屬性存在時(shí),對(duì)應(yīng)的功能是修改屬性值.當(dāng)屬性不存在時(shí),是添加屬性.
dog1.name = '大黃'
print(dog1.name) # 大黃;改
dog1.sex = '母'
print(dog1.sex) # 母;增
setattr(dog1, 'name', 'hotdog')
print(dog1.name) # hotdog;改
setattr(dog1, 'name2', 'roudog')
print(dog1.name2) # roudog;增
- 3.刪除
a.del 對(duì)象.屬性
b.delattr(對(duì)象, 屬性名)
del dog1.name
# print(dog1.name) # AttributeError: 'Dog' object has no attribute 'name'
注意:對(duì)象屬性的增刪改查都是針對(duì)指定的那一個(gè)對(duì)象,不會(huì)影響其他對(duì)象
- 4.slot魔法
__slots__是用來約束當(dāng)前這個(gè)類有哪些對(duì)象屬性
class Student:
# Student類的對(duì)象只能有name age id sex這幾個(gè)只能少,不能多
__slots__ = ('name', 'age', 'id', 'sex') # 限制類的屬性
def __init__(self, name, age):
self.name = name
self.id = '001'
self.age = age
stu1 = Student('小明', 18)
# stu1.neme = '666' # 因?yàn)橛衧lots魔法,所以不能添加
stu1.sex = '666' # 可以添加,且不影響其他對(duì)象
13.6 類的字段和內(nèi)置類屬性
- 1.類的字段
a.聲明在類中且在函數(shù)外的變量,叫做類的字段.
b.類的字段需要通過類來使用:類.字段 - 不論是在類中還是類外,都需要。
類的字段:不會(huì)因?yàn)閷?duì)象不同而不一樣的數(shù)據(jù)就聲明為類的字段
class Person:
# 聲明了一個(gè)字段number
number = 61
def show_number(self):
print('人類的數(shù)量:%d' % Person.number)
print(Person.number) # 61
- 2.內(nèi)置類屬性
內(nèi)置屬性就是聲明類的時(shí)候,類中已經(jīng)聲明好的屬性(包含類的字段和對(duì)象屬性),
class Dog:
"""說明文檔:傻狗"""
# 類的字段
type = '犬科'
# 聲明對(duì)象屬性
def __init__(self, name, color, age):
self.name = name
self.color = color
self.age = age
# 對(duì)象方法
def eat(self, food):
print('%s在吃%s' % (self.name, food))
# 類方法
@classmethod
def shout(cls):
print('汪汪汪~')
# 靜態(tài)方法
@staticmethod
def bite():
print('狗咬人!!')
dog1 = Dog('小黑', 3, '黑色')
a._name_
類._name_ - 獲取類的名字(字符串)
print(Person.__name__) # Person;獲取類的名字
b._class_
對(duì)象._class_ - 獲取對(duì)象對(duì)應(yīng)的類(結(jié)果是一個(gè)類,類能做的它都可以做)
print(Person.__class__) # <class 'type'>
print(dog1.__class__) # <class '__main__.Dog'>
dog1 = Dog('小黑', 3, '黑色')
dog2 = dog1.__class__('小黑', 3, '黑色') # 可以創(chuàng)建對(duì)象
print(dog1.__class__.__name__) # 有一個(gè)類的對(duì)象,可以獲取到類的名字
c._dict_
(了解)類._dict_ - 獲取當(dāng)前類的所有字段及其對(duì)應(yīng)的值
(重點(diǎn))對(duì)象._dict_ - 將當(dāng)前對(duì)象所有的對(duì)象屬性及其值轉(zhuǎn)換成字典,key是屬性名,value是屬性值.(數(shù)據(jù)本地化必須操作)
print(Dog.__dict__) # 獲取類的所有字段和其地址組成的字典
print(dog1.__dict__) # {'name': '小黑', 'color': 3, 'age': '黑色'}
d._bases_
類._bases_ - 獲取當(dāng)前類的父類(以元組形式返回,元組中的元素就是類的父類名)
print(Dog.__bases__) # (<class 'object'>,)元組;python支持多繼承,所以為元組
e._module_
類名._module_ - 獲取當(dāng)前類所在模塊的模塊名
print(Dog.__module__) # __main__
f._doc_
類._doc_ - 獲取類的說明文檔
print(Dog.__doc__) # 說明文檔:傻狗