python用法查询笔记(二)—— 面向对象
PS:文章中的代码名命方式只是便于理解,不是规范代码,实际操作请遵守代码规范~
(内赠完整python发邮件示例,含注释)
类
1. 创建类
语法:类名一般首字母要大写,(): 不能丢
class ClassName():# 如定义一个名为’狗’的类,可以写成class Dog():
def function1(): # 规范:class语句后续的代码块要缩进
#定义类中的函数1
例:
class 智能机器人():
胸围 = 33
腰围 = 44
臀围 = 55
智商 = 200
def 打招呼():
print('主人你好!')
def 卖萌():
print('主人,求抱抱!')
def 生气():
print('主人,我要报警了!')
print(智能机器人.智商)
智能机器人.打招呼()
智能机器人.卖萌()
智能机器人.生气()
'''
运行结果:200
主人你好!
主人,求抱抱!
主人,我要报警了!
'''
2. 把类中的变量传递给类中的函数
class 类A():
变量1 = 100
变量2 = 200
@classmethod #①@classmethod声明了函数1是类方法
def 函数1(cls): #②
print(cls.变量1)#③
print(cls.变量2)
类A.函数1()#三个格式缺一不可
3. 给类方法传参
class 念诗类():
一首诗 = ['《卜算子》','我住长江头,','君住长江尾。','日日思君不见君,','共饮长江水。']
@classmethod
def 念诗函数(cls,参数):
print('念给'+ 参数 +'的诗:')
for i in cls.一首诗:
print(i)
念诗类.念诗函数('张三')
4. 类的实例化
4.1.从外部增加/修改
class 幸运():
@classmethod
def 好运翻倍(cls):
print('好的,我把它存了起来,然后翻了888倍还给你:' + str(cls.幸运数*888))
# 或者这样写也可以:
# print('好的,我把它存了起来,然后翻了888倍还给你:%d' % (cls.幸运数*888))
幸运.幸运数 = int(input('你的幸运数是多少?请输入一个整数。'))
幸运.好运翻倍()
'''
运行结果:
你的幸运数是多少?请输入一个整数。777
好的,我把它存了起来,然后翻了888倍还给你:689976
'''
4.2.从内部增加/修改
class 念诗类():
一首诗 = ['《卜算子》','我住长江头,','君住长江尾。','日日思君不见君,','共饮长江水。']
@classmethod
def 念诗函数(cls):
cls.接收人 = input('请输入你想给谁念诗:')
print('念给'+ cls.接收人 +'的诗:')
for i in cls.一首诗:
print(i)
念诗类.念诗函数()
'''
运行结果:
请输入你想给谁念诗:啦啦啦
念给啦啦啦的诗:
《卜算子》
我住长江头,
君住长江尾。
日日思君不见君,
共饮长江水。
'''
5. 类的实例化
class 类():
变量 = 100
实例1 = 类() # 实例化
实例2 = 类() # 实例化
print(类.变量)
print(实例1.变量)
print(实例2.变量)
'''
运行结果:
100
100
100
'''
6. 重写类方法
class 类():
def 原始函数(self):
print('我是原始函数!')
def 新函数(self):
print('我是重写后的新函数!')
a = 类() # 实例化
a.原始函数()
# 用新函数代替原始函数,也就是【重写类方法】
类.原始函数 = 新函数
# 现在原始函数已经被替换了
a.原始函数()
'''
运行结果:我是原始函数!
我是重写后的新函数!
'''
注意:这里的赋值是在替换方法,并不是调用函数,所以【不要加上括号】—— 写成类.原始函数() = 新函数()是错误的。
7. 初始化函数
class 成绩单():
def __init__(self,学生姓名,语文_成绩,数学_成绩):
self.学生姓名 = 学生姓名
self.语文_成绩 = 语文_成绩
self.数学_成绩 = 数学_成绩
def 打印成绩单(self):
print(self.学生姓名 + '的成绩单如下:')
print('语文成绩:'+ str(self.语文_成绩))
print('数学成绩:'+ str(self.数学_成绩))
成绩单1 = 成绩单('张三',99,88)
成绩单2 = 成绩单('李四',64,73)
成绩单3 = 成绩单('王五',33,22)
成绩单1.打印成绩单()
成绩单2.打印成绩单()
成绩单3.打印成绩单()
'''
运行结果:
张三的成绩单如下:
语文成绩:99
数学成绩:88
李四的成绩单如下:
语文成绩:64
数学成绩:73
王五的成绩单如下:
语文成绩:33
数学成绩:22
'''
8. 继承
格式:单继承–class 子类(父类) 多重继承–class 子类(父类1,父类2)
class 基础机器人():
def __init__(self,参数):
self.姓名 = 参数
def 自报姓名(self):
print('我是' + self.姓名 + '!')
def 卖萌(self):
print('主人,求抱抱!')
class 高级机器人(基础机器人):
def 高级卖萌(self):
print('主人,每次想到怎么欺负你的时候,就感觉自己全身biubiubiu散发着智慧的光芒!')
安迪 = 高级机器人('安迪')
安迪.自报姓名()
安迪.卖萌()
安迪.高级卖萌()
重写子类方法
class 基础机器人():
def __init__(self,参数):
self.姓名 = 参数
def 自报姓名(self):
print('我是' + self.姓名 + '!')
def 卖萌(self):
print('主人,求抱抱!')
class 高级机器人(基础机器人):
def 自报姓名(self):
print('我是高级机器人' + self.姓名 + '!')
def 卖萌(self):
print('主人,每次想到怎么欺负你的时候,就感觉自己全身biubiubiu散发着智慧的光芒!')
安迪 = 高级机器人('安迪')
安迪.自报姓名()
安迪.卖萌()
'''
运行结果:
我是高级机器人安迪!
主人,每次想到怎么欺负你的时候,就感觉自己全身biubiubiu散发着智慧的光芒!
'''
文件
1. 关于open()函数
格式:
open(r'c:\Users\Administrator\Desktop\test\abc.txt','r',encoding='gbk')
PS:打开文件必须关掉即file1.close()
为防止忘记关闭,可采用写法二:
with open(‘abc.txt’,’a’) as file1:
file1.write(‘hhh’)
记得缩进,记得冒号
2. 读取文件
#读文件:开--读--关
file1 = open(r'c:\Users\Administrator\Desktop\test\abc.txt','r',encoding='gbk')
filecontent = file1.read()
print(filecontent)
file1.close()
3. 写入文件
#写文件:开--写--关
file1 = open(r'c:\Users\Administrator\Desktop\test\abc.txt','a',encoding='gbk')
file1.write('我真是一个小机灵鬼\n')
file1.write('哈哈哈\n')
file1.close()
4. 对文件内容操作涉及的一些函数
- readlines()----按行读取
readlines() 会从txt文件取得一个列表,列表中的每个字符串就是txt文件中的每一行。而且每个字符串后面还有换行的\n符号。
file1 = open('/Users/Ted/Desktop/scores.txt','r',encoding='utf-8')
file_lines = file1.readlines()
file1.close()
for i in file_lines: #用for...in...把每一行的数据遍历
print(i) #打印变量
- split()----按空格把字符串里的内容分开
file1 = open('/Users/Ted/Desktop/scores.txt','r',encoding='utf-8')
file_lines = file1.readlines()
file1.close()
for i in file_lines: #用for...in...把每一行的数据遍历
data =i.split() #把字符串切分成更细的一个个的字符串
print(data) #打印出来看看
- join()-----合并字符串
join()的用法是str.join(sequence),str代表在这些字符串之中,你要用什么字符串连接,在这里两个例子,一个是空字符串,一个是横杠,sequence代表数据序列,在这里是列表a。
a=['c','a','t']
b=''
print(b.join(a))
c='-'
print(c.join(a))
#》》cat
c-a-t
5. 关于编码
print('小吴'.encode('gbk'))
print(b'\xd0\xa1\xce\xe2'.decode('gbk'))
print('小吴'.encode('utf-8'))
print(b'\xe5\xb0\x8f\xe5\x90\xb4'.decode('utf-8'))
#》》
b'\xd0\xa1\xce\xe2'
小吴
b'\xe5\xb0\x8f\xe5\x90\xb4'
小吴
模块
1. 使用自己的模块
- import语句
主要目的:导入整个模块,利用模块中已经封装好的变量、函数、类。
用法二:import…as…。比如我们觉得import story太长,就可以用import story as s语句,意思是为“story”取个别名为“s”。
#test.py#
a = '我是模块中的变量a'
def hi():
a = '我是函数里的变量a'
print('函数“hi”已经运行!')
class Go1: # 如果没有继承的类,class语句中可以省略括号,但定义函数的def语句括号不能省
a = '我是类1中的变量a'
@classmethod
def do1(cls):
print('函数“do1”已经运行!')
class Go2:
a = '我是类2中的变量a'
def do2(self):
print('函数“do2”已经运行!')
# 这是主程序main.py#
import test # 导入test模块
print(test.a) # 使用“模块.变量”调用模块中的变量
test.hi() # 使用“模块.函数()”调用模块中的函数
print(test.Go1.a) # 使用“模块.类.变量”调用模块中的类属性
test.Go1.do1() # 使用“模块.类.函数()”调用模块中的类方法
A = test.Go2() # 使用“变量 = 模块.类()”实例化模块中的类print(A.a) # 实例化后,不再需要“模块.”
A.do2() # 实例化后,不再需要“模块.”
'''
我是模块中的变量a
函数“hi”已经运行!
我是类1中的变量a
函数“do1”已经运行!
我是类2中的变量a
函数“do2”已经运行!
'''
- from … import …语句
用途:从模块中导入一个指定的部分到当前模块。
格式:
# 【文件:test.py】def hi():
print('函数“hi”已经运行!')
# 【文件:main.py】from test import hi # 从模块test中导入函数“hi”
hi() # 使用函数“hi”时无需加上“模块.”前缀
'''
函数“hi”已经运行!
'''
从模块中同时导入多个指定内容:用逗号隔开,写成from xx模块 import a,b,c的形式。
从模块中指定所有内容直接使用:可以写成【from xx模块 import *】的形式,*代表“模块中所有的变量、函数、类”。(一般不建议)
- if name == 'main’语句
#A.py#
import B #运行结果为空
#B.py#
a = '我是模块中的变量a'
def hi():
a = '我是函数里的变量a'
print('函数“hi”已经运行!')
class Go1: # 如果没有继承的类,class语句中可以省略括号,但定义函数的def语句括号不能省
a = '我是类1中的变量a'
@classmethod
def do1(cls):
print('函数“do1”已经运行!')
class Go2:
a = '我是类2中的变量a'
def do2(self):
print('函数“do2”已经运行!')
if __name__ == '__main__':
print('是主模块的时候才会执行以下语句:')
print(a)
hi()
print(Go1.a)
Go1.do1()
a = Go2()
print(Go2.a)
a.do2()
'''
#运行B.py时结果如下:
是主模块的时候才会执行以下语句:
我是模块中的变量a
函数“hi”已经运行!
我是类1中的变量a
函数“do1”已经运行!
我是类2中的变量a
函数“do2”已经运行!
'''
2. 使用他人模块
- 参看教程
英文:https://docs.python.org/3.6/library/csv.html(以csv为例)
中文:https://yiyibooks.cn/xx/python_352/library/csv.html#module-csv - 直接百度用法
使用dir()函数得知该模块的类、函数,直接百度用法
3. 模块用法示例
- smtplib模块:发邮件
用法:
import smtplib #引用smtplib模块
server = smtplib.SMTP() #通过SMTP协议指定服务器
server.connect(host, port)
#连接指定的服务器
# host:服务器域名
# port:端口(默认为25)
server.login(username, password)
#username:登录邮箱的用户名
#password:授权码
server.sendmail(sender, to_addr, msg.as_string())
#from_addr:邮件发送地址,就是上面的username
#to_addr:邮件收件人地址
#msg.as_string():为一个字符串类型
server.quit()
#退出服务器,结束SMTP会话
- email模块:构建邮件内容
MIMEText:内容形式为纯文本、HTML页面
MIMEImage:内容形式为图片
MIMEMultipart:多形式组合,可包含文本和附件。
导入形式
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
MIMEText()方法需要输入三个参数:文本内容,文本类型和文本编码。
例:
msg = MIMEText('send by python','plain','utf-8')
- MyQR模块——制作二维码
'''
自制动态二维码
使用MyQR模块
'''
# 先导入模块
from MyQR import myqr
myqr.run(
words='https://baike.baidu.com/item/%E8%82%96%E6%88%98/18866899?fr=aladdin',
# 扫描二维码后,显示的内容,或是跳转的链接
version=5, # 设置容错率
level='H', # 控制纠错水平,范围是L、M、Q、H,从左到右依次升高
picture='xz.gif', # 图片所在目录,可以是动图
colorized=True, # 黑白(False)还是彩色(True)
contrast=1.0, # 用以调节图片的对比度,1.0 表示原始图片。默认为1.0。
brightness=1.0, # 用来调节图片的亮度,用法同上。
save_name='Python.gif', # 控制输出文件名,格式可以是 .jpg, .png ,.bmp ,.gif
)
完整发邮件示例
import smtplib
from email.mime.text import MIMEText
from email.header import Header
import csv
#from email.mime.image import MIMEImage
#from email.mime.multipart import MIMEMultipart
#发信方信息:发信邮箱、QQ邮箱授权码
from_addr = input('请输入登录邮箱:')
password = input('请输入邮箱授权码:')
#收信方邮箱
#to_addr = input('请输入收件邮箱:')
to_addr = []
while True:
a = input('请输入收件人邮箱:')
to_addr.append(a)
b = input('是否继续,n退出,任意键继续:')
if b == 'n':
break
print(to_addr)
# 待写入csv文件的收件人数据:人名+邮箱
data = [['xxx','xxx@qq.com'],['xxx','xxx@qq.com']]
#写入收件人数据
with open('to_addr.csv','w',newline='') as f:
writer = csv.writer(f)
for row in data:
writer.writerow(row)
#发信服务器
smtp_server = 'smtp.qq.com'
#发信内容
text = """Hi,你好啊,这是我的第一封python邮件!
收到这封邮件,说明我成功运行了代码^-^
For you , a thousand times over!
为你千千万万遍
愿山河无恙,你我相安!
"""
#读取收件人数据,并启动写信和发信流程
with open('to_addr.csv','r') as f:
reader = csv.reader(f)
for row in reader:
to_addr = row[1]
msg = MIMEText(text,'plain','utf-8')
#邮件头信息
msg['From'] = Header(from_addr)
msg['To'] = Header(','.join(to_addr))
#msg['To'] = Header(to_addr)
msg['Subject'] = Header('python test')
#开启发信服务,这里使用加密传输
server = smtplib.SMTP_SSL(smtp_server)
server.connect(smtp_server, 465)#如果出现编码错误UnicodeDecodeError,你可以这样写:server.connect('smtp.qq.com', 465,'utf-8')
#登录发信邮箱
server.login(from_addr, password)
#发送邮件
try:
server.sendmail(from_addr, to_addr, msg.as_string())
print('发送成功!')
except:
print('出错啦,再检查一下吧!')
#关闭服务器
server.quit()
其余的请自行探索~