"""author = Zard"""
1.編程思想
1)面向過程編程:算法和邏輯
2)面向?qū)ο缶幊蹋侯惡蛯?duì)象 -- 面向生活編程
3)函數(shù)式編程:
2.類和對(duì)象
1.什么是類,什么是對(duì)象
類就是擁有相同功能和相同屬性的對(duì)象的集合 -- 類是抽象的
對(duì)象就是類的實(shí)例 -- 對(duì)象是具體的
如果說人是一個(gè)類,駱昊就是一個(gè)對(duì)象,小明是另一個(gè)對(duì)象
如果說整數(shù)是一個(gè)類,100是一個(gè)對(duì)象,3是另外一個(gè)對(duì)象
2.類的聲明
1)語(yǔ)法
class 類名:
類的內(nèi)容
2)說明
class -- 關(guān)鍵字
類名 -- 程序員自己命名:是標(biāo)識(shí)符但不能是關(guān)鍵字(要求):
采用駝峰式命名。并且首字母大寫
類的內(nèi)容 - 包含類的說明文檔、類中的函數(shù)(相同的功能)、類中的屬性(相同的屬性)
3.創(chuàng)建對(duì)象
1)語(yǔ)法
對(duì)象 = 類()
class Person:
"""類的說明文檔:人類"""
def eat(self):
print('吃飯')
# 創(chuàng)建Person類的對(duì)象
p1 = Person()
# 同一個(gè)類可以有多個(gè)對(duì)象
p2 = Person()
3.對(duì)象方法
1.類中的函數(shù)
聲明在類中的函數(shù)又叫 方法,類中的方法分為3種:對(duì)象方法、類方法、靜態(tài)方法
1)對(duì)象方法
直接聲明在類中的函數(shù),自帶一個(gè)self參數(shù)。
對(duì)象方法需要通過 '對(duì)象.函數(shù)名' 的方式來調(diào)用
通過對(duì)象調(diào)用對(duì)象方法的時(shí)候,self不需要傳參;系統(tǒng)會(huì)自動(dòng)將當(dāng)前對(duì)象傳給self(誰(shuí)調(diào)用指向誰(shuí))
強(qiáng)調(diào):對(duì)象方法就用對(duì)象去調(diào)用,不要用類去調(diào)用對(duì)象方法
class Person:
"""類的說明文檔:人類"""
def eat(self):
print('吃飯')
p1 = Person()
p1.eat()
# Person.eat(100) 沒意義
4.init方法
1.什么是 init 方法
是類中的一個(gè)魔法方法,也是對(duì)象方法;在創(chuàng)建對(duì)象時(shí)會(huì)被自動(dòng)調(diào)用
2.構(gòu)造方法(了解)
-- 開辟空間創(chuàng)建對(duì)象
-- 使用創(chuàng)建好的對(duì)象調(diào)用init方法(做一些初始化操作)
-- 返回對(duì)象
注意:如果init方法中出了self以外還有其他的參數(shù),需要通過構(gòu)造方法來給init方法傳參
這兒person1()就是在調(diào)用構(gòu)造方法
class Person1:
def __init__(self,x,y):
print('init方法被調(diào)用',x,y)
# 當(dāng)然也可以用關(guān)鍵字參數(shù)傳參
5.類中的屬性
1.類中的屬性:對(duì)象屬性、字段
1)字段
a.怎么聲明:聲明在類的里面函數(shù)的外面的變量,就是類的字段
b.怎么使用:通過 "類.字段" 的方式去使用
c.什么時(shí)候用:屬性值不會(huì)因?yàn)閷?duì)象不同而不一樣,這樣的屬性就聲明成類的字段
2)對(duì)象屬性(重點(diǎn)) --
a.怎么聲明:以"self.屬性名 = 值" 的方式聲明在init方法中
b.怎么使用:通過"對(duì)象.屬性名"的方式去使用
c.什么時(shí)候用:屬性值會(huì)因?yàn)閷?duì)象不同而不一樣,這樣的屬性就聲明成對(duì)象屬性
三種賦值:1、直接設(shè)置參數(shù),傳參,2、直接設(shè)置初始值,不用傳參,3、設(shè)置參數(shù)默認(rèn)值
class Person:
# num就是類的字段
num = 61
def __init__(self):
# 這兒的name、age、gender就是Person類的對(duì)象屬性
self.name = ''
self.age = 0
self.gender = '男'
print(Person.num) # 61
Person.num = 100
print(Person.num) # 100
p1 = Person()
p1.name = '小明'
p2 = Person()
p2.name = '小花'
class Dog:
def __init__(self,name1,age1,color1,breed1):
self.name = name1
self.age = age1
self.color = color1
self.breed = breed1
# 返回值必須是字符串
def __repr__(self):
return str(self.__dict__)
dog1 = Dog('大黃',3,'黃色','小狼狗')
dog2 = Dog('小花',1,'黑色','金毛')
print(dog1.name,dog2.name) # 大黃 小花
print(dog1) # <main.Dog object at 0x00000253F1640B38> 打印的是地址
需要重寫repr方法,來定制對(duì)象的打印格式(默認(rèn)對(duì)象地址)
重寫后:
{'name': '大黃', 'age': 3, 'color': '黃色', 'breed': '小狼狗'}
練習(xí):聲明一個(gè)矩形類,有屬性:長(zhǎng)和寬,功能:計(jì)算矩形的面積和周長(zhǎng)
class Rect_wyk:
"""矩形類"""
def __init__(self,x,y):
self.x = x
self.y = y
def area(self):
return 2 * self.y + 2 * self.x
def perim(self):
return self.x * self.y
a = Rect_wyk(2,3)
print(a.area())
print(a.perim())
6.對(duì)象屬性的增刪改查
===1.對(duì)象屬性===
python中對(duì)象的屬性支持增刪改查操作
===2.查 -- 獲取對(duì)象屬性的值===
- 對(duì)象.屬性 - 獲取對(duì)象指定屬性的值,如果屬性不存在,報(bào)錯(cuò)!
- getattr(對(duì)象,屬性名) - 獲取對(duì)象指定屬性的值,如果屬性不存在,報(bào)錯(cuò)!
getattr(對(duì)象,屬性名str,默認(rèn)值) - 獲取對(duì)象指定屬性的值,如果屬性不存在,不會(huì)報(bào)錯(cuò)而是返回默認(rèn)值。
(當(dāng)屬性名通過別的方式得到時(shí),增刪改查要用attr方法)
===3.增、改 - 給對(duì)象添加屬性/修改對(duì)象屬性的值=== - 對(duì)象.屬性 = 值 --- 當(dāng)屬性不存在就給對(duì)象添加屬性,如果屬性存在就修改屬性的值
- setattr(對(duì)象,屬性名str,值) - 功能同上
===4.刪 --- 刪除對(duì)象屬性===
- del 對(duì)象.屬性
- delattr(對(duì)象,屬性名)
=========注意:屬性的增刪改查只針對(duì)當(dāng)前對(duì)象有效,不會(huì)作用于其他對(duì)象==========
"""
class Person:
# 可以通過類的__slots__字段賦值,來約束當(dāng)前類的對(duì)象最多有哪些屬性值
__slots__ = ('name','age','gender')
def __init__(self,name,age=0,gender='男'):
self.name = name
self.age = age
self.gender = gender
p1 = Person('小明',18)
p2 = Person('小花',20,'女')
print(p1.name)
print(getattr(p1,'name'))
7.內(nèi)置類屬性
1.什么是內(nèi)置類屬性
創(chuàng)建類的時(shí)候,系統(tǒng)自動(dòng)為這個(gè)類提供的屬性
class Person:
"""說明文檔:人類"""
num = 61
def __init__(self,name,age=0,gender='女'):
self.name = name
self.age = age
self.gender = gender
def eat(self,food):
print('%s在吃%s' % (self.name,food))
# 定制對(duì)象的打印
def __repr__(self):
return '<%s>' % str(self.__dict__)[1:-1] # 一般用__repr__
# return
# 定制對(duì)象的打印
# def __str__(self):
# return '<%s>' % str(self.__dict__)[1:-1] # 打印對(duì)象為序列時(shí),仍打印為地址,不常用
p1 = Person('Tom',18,'男')
1.name
類的字段,獲取類的名字
print(Person.name) # Person
print(Person) # <class 'main.Person'>
2.doc
類的字段,獲取類的說明文檔
print(Person.doc) # 說明文檔:人類
3.class
對(duì)象屬性,獲取對(duì)象對(duì)應(yīng)的
c1 = p1.class
print(c1) # <class 'main.Person'> 現(xiàn)在c1作用等同于Person
4.dict
1)類的字段,獲取類中的字段(用得少)
2)對(duì)象屬性,獲取對(duì)象的所有屬性和其對(duì)應(yīng)的值,以字典的形式返回(用得多)
注意:如果給類的slots的屬性賦了值,那么類的對(duì)象就不能使用
dict去獲取所有的屬性 (較多用dict)
print(Person.dict) # {'module': 'main', 'doc': '說明文檔:人類', 'num': 61, 'init': <function Person.init at 0x000002242F943730>, 'eat': <function Person.eat at 0x000002242F9437B8>, 'dict': <attribute 'dict' of 'Person' objects>, 'weakref': <attribute 'weakref' of 'Person' objects>}
print(p1.dict) # {'name': 'Tom', 'age': 18, 'gender': '男'}
5.module
類的字段,獲取類所在的模塊(類是再哪個(gè)py文件中聲明的)返回的是模塊名
print(Person.module) # main
print(int.module) # builtins
6.bases
類的字段,獲取當(dāng)前類的父類
print(Person.bases) # (<class 'object'>,)