一.編程思想
編程思想: 面向過程編程(窮人思想), 函數(shù)式編程, 面向?qū)ο缶幊?富豪)
面向過程編程 - 算法和邏輯
函數(shù)式編程 - 函數(shù)
面向?qū)ο缶幊? - 類和對(duì)象
1.求1+...+100
sum1 = 0
for n in range(1, 101):
sum1 += n
print(sum1)
def sum1(x: int):
sums = 0
for m in range(1, x+1):
sums += m
return sums
print(sum1(100))
print(sum(range(1, 101)))
===面向?qū)ο?==
求1+...+100
class Math:
def sums(self, a):
sum3 = 0
for x in range(1, a + 1):
sum3 += x
return sum3
def produc(self, q):
sum2 = 1
for x in range(1, q + 1):
sum2 *= x
return sum2
s = Math()
print(s.sums(100))
print(Math().produc(14))
二.類和對(duì)象
1.什么是類, 什么是對(duì)象
類就是擁有相同屬性,相同功能的對(duì)象的集合
對(duì)象就是類的實(shí)例(具體的)
如果是人類, 具體的某個(gè)人就是人的對(duì)象
如果水杯是類, 我桌上的這個(gè)黑色杯子就是對(duì)象
如果車是類, 具體的某一輛車就是對(duì)象
2.類的聲明 - 確定這個(gè)類共同的屬性和功能是什么
1)語(yǔ)法:
class 類名:
類的說明文檔
類的內(nèi)容
2)說明
class - 關(guān)鍵字
類名 - 要求: 標(biāo)識(shí)符, 不能是關(guān)鍵字
規(guī)范: a.首字母大寫, 采用駝峰式命名規(guī)范 b.見名知義 c.不能使用系統(tǒng)提供的函數(shù)或者類名
類的說明文檔 - 和函數(shù)說明文檔一樣
類的內(nèi)容 - 主要包含屬性和方法(方法就是生命在類中的函數(shù))
class Person:
"""人類:
屬性-
方法-
"""
def eat(self, food): # 對(duì)象方法
print('eat %s' % food)
@classmethod # 類方法
def func1(cls):
pass
@staticmethod # 靜態(tài)方法
def func2():
pass
3.聲明對(duì)象
1)語(yǔ)法:
對(duì)象 = 類()
p1 = Person() # p1存儲(chǔ)的就是Person類的對(duì)象
p2 = Person() # 同一個(gè)類可以創(chuàng)建對(duì)個(gè)對(duì)象
p3 = p1 # p1和p3指向同一個(gè)對(duì)象
p1.eat('noodles')
三.對(duì)象方法
1.對(duì)象方法
類中的方法分為: 對(duì)象方法, 類方法和靜態(tài)方法
1)對(duì)象方法
a.怎么聲明: 直接聲明(聲明前不需要加任何裝飾器)在類中的函數(shù)就是對(duì)象方法
b.特點(diǎn): 自帶self參數(shù); 用對(duì)象調(diào)用對(duì)象方法的時(shí)候self不用傳參, 系統(tǒng)會(huì)自動(dòng)將當(dāng)前對(duì)象傳給self, self可以做到誰(shuí)調(diào)用就指向誰(shuí)
c.怎么調(diào)用: 以'對(duì)象.對(duì)象方法()'的形式來調(diào)用 - 通過對(duì)象來調(diào)用對(duì)象方法
class Person:
def eat(self, food='米飯'):
print(self)
print('eat')
print('人在吃{}'.format(food))
p1 = Person()
print(p1)
p1.eat()
p2 = Person()
print(p2)
p2.eat('miles')
# Person.eat('asd')
四.構(gòu)造方法
1.構(gòu)造函數(shù) - 函數(shù)名和類名一樣, 用來創(chuàng)建類的對(duì)象的函數(shù)
python中聲明類的時(shí)候, 系統(tǒng)會(huì)自動(dòng)為這個(gè)類創(chuàng)建一個(gè)構(gòu)造函數(shù), 函數(shù)的作用是創(chuàng)建對(duì)象
構(gòu)造方法的執(zhí)行過程: a.在內(nèi)存中開辟空間創(chuàng)建對(duì)象 b.用創(chuàng)建好的對(duì)象去調(diào)用init方法 c.返回對(duì)象在內(nèi)存中的地址
2.init方法
聲明在類中用來對(duì)對(duì)象進(jìn)行初始化的方法: (當(dāng)對(duì)象一創(chuàng)建出來, 這個(gè)方法就會(huì)被自動(dòng)調(diào)用)
注意: 創(chuàng)建對(duì)象的時(shí)候構(gòu)造方法需不需要傳參, 需要傳幾個(gè)參數(shù), 看這個(gè)類的init方法
class Dog:
def __init__(self, name='', age=0):
print(self)
print('初始化', name, age)
dog1 = Dog('baba', 18)
print(dog1)
dog2 = Dog('baba', 20)
dog3 = Dog()
#構(gòu)造方法的偽代碼
def Dog():
對(duì)象 = 開辟空間創(chuàng)建對(duì)象
對(duì)象.__init__()
return 對(duì)象
五.屬性
1.類中的屬性
屬性就是聲明在類中的變量
類中的屬性分為: 字段, 對(duì)象屬性
1)字段
a.怎么聲明: 生命在類的里面函數(shù)的外面的變量就是字段
b.怎么使用: 通過類去使用(以'類.字段'的形式使用)
c.什么時(shí)候使用: 屬性值不會(huì)因?yàn)閷?duì)象不同而不同, 這樣的屬性就聲明成類的字段
class Person:
# num 就是字段
num = 100
def func1(self):
pass
def func2(self):
pass
Person.num = 123
print(Person.num)
2)對(duì)象屬性(重要)
a.怎么聲明: 以'self.屬性名=值'的形式聲明在init方法中
b.怎么使用: 通過對(duì)象去使用,
c.什么時(shí)候用: 屬性的值可能會(huì)因?yàn)閷?duì)象不同而不一樣, 這樣的屬性就聲明成對(duì)象屬性
class Student:
def __init__(self, name, age, sno, sex='b'):
# 這兒的name, age, sex, sno 就是對(duì)象屬性
self.name = name
self.age = age
self.sex = sex
self.sno = sno
stu1 = Student('小明', 18, 'stu001', 'n')
stu1.name = 'lxh'
print(stu1.name, stu1.age, stu1.sex, stu1.sno)
練習(xí): 聲明一個(gè)Dog類,
1)擁有屬性: 名字, 年靚, 性別和類型; 要求創(chuàng)建對(duì)象的時(shí)候名字, 品種必須賦值, 年齡和性別可以不賦值
2)擁有兩個(gè)方法, 一個(gè)用來打印狗的信息(顯示信息), 一個(gè)叫喚的方法: 以'xxx: 汪汪'的格式打印叫喚信息
class Dog:
def __init__(self, name, breed, age=3, sex='母'):
self.name = name
self.breed = breed
self.age = age
self.sex = sex
def message(self):
print(self.name, self.age, self.sex, self.breed)
def shout(self):
print('%s: 汪汪汪!!!' % self.name)
dog1 = Dog('小白', '哈奇士')
dog1.message()
dog1.shout()
六.對(duì)象屬性的增刪改查
python中類的對(duì)象的對(duì)象屬性支持增刪改查
class Person:
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
p1 = Person('小明', 19, '男')
p2 = Person('小花', 18, '女')
1.查(獲取屬性的值)
方法一: 對(duì)象.屬性
方法二: getattr(對(duì)象, 屬性名: str) / getattr(對(duì)象, 屬性名, 默認(rèn)值)
方法三: 對(duì)象.__getattribute__(屬性名)
print(p1.name) # 簡(jiǎn)單
print(getattr(p1, 'name')) # 靈活
print(p1.__getattribute__('name'))
# value = input('屬性名:')
# print(getattr(p1, value))
# print(p1.height) # AttributeError
print(getattr(p1, 'height', 180))
2.增/改
方法一: 對(duì)象.屬性 = 值
方法二: setattr(對(duì)象, 屬性名, 值)
# 屬性存在是修改
p1.name = '明明'
print(p1.name)
setattr(p1, 'age', 38)
print(p1.age)
# 屬性不存在就添加
p1.weight = 190
print(p1.weight)
setattr(p1, 'face', 60)
print(p1.face)
3.刪
方法一: del 對(duì)象.屬性
方法二: delattr(對(duì)象, 屬性名)
del p1.name
# print(p1.name) # AttributeError: 'Person' object has no attribute 'name'
delattr(p1, 'face')
# print(p1.face) # AttributeError: 'Person' object has no attribute 'face'
4.slots魔法
通過給slots字段賦值來約束當(dāng)前類的對(duì)象有哪些對(duì)象屬性
class Dog:
__slots__ = ('name', 'age', 'sex', 'height', 'weight')
def __init__(self, name, age):
self.name = name
self.age = age
dog1 = Dog('大黃', 3)
dog1.name = '皇皇'
dog1.height = 180