‘False’, ‘None’, ‘True’, ‘__
peg_parser__’, ‘and’, ‘as’, ‘assert’, ‘async’, ‘await’, ‘break’, ‘class’, ‘continue’, ‘def’, ‘del’, ‘elif’, ‘else’, ‘except’, ‘finally’, ‘for’, ‘from’, ‘global’, ‘if’, ‘import’, ‘in’, ‘is’, ‘lambda’, ‘nonlocal’, ‘not’, ‘or’, ‘pass’, ‘raise’, ‘return’, ‘try’, ‘while’, ‘with’, ‘yield’
myAge = 20
print("我的年龄是%d岁" % myAge)
myName = input("please enter your Name:")
myAge = input("please enter your Age:")
print("Name:%s Age:%s" % (myName,myAge))
运算符
常用数据类型转换
if 判断条件1:
执行语句1
elif 判断条件2:
执行语句2
else:
执行语句3
money = eval(input("请输入您公交卡的余额:"))
flag = not True
if money >= 2:
print("可以上公交车")
if flag:
print("可以坐下")
else:
print("站一会")
else:
print("请充值后再上车")
while 判断条件:
执行语句
循环标识+1
#九九乘法表
x = 1
while x <= 9:
# 定义一个变量 记录列数
y = 1
while y <= x:
print("%d * %d = %-2d" % (y, x, x * y), end=" ")
y += 1
# 换行
print()
x += 1
for 临时变量 in 可迭代对象(列表/字符串/...):
执行语句
for i in range(5):
print(i)
if i == 2:
#break
else:
print("else")
# while循环
i = 0
while i < 5:
print(i)
if i == 2:
break
i += 1
else:
print("else")
"""
无论for-else 还是 while-else 如果在for循环中 或者 while循环中 没有执行break 待for循环或者while结束后 会执行else中的代码
当for循环或者while循环中的break执行 else中的代码将不会执行
"""
namesList = ['xiaoWang','xiaoZhang','xiaoHua']
for name in namesList:
print(name)
length = len(namesList)
i = 0
while i<length:
print(namesList[i])
i+=1
>>> a = [1, 2]
>>> b = [3, 4]
>>> a.append(b)
>>> a
[1, 2, [3, 4]]
>>> a.extend(b)
>>> a
[1, 2, [3, 4], 3, 4]
>>> a.insert(1, 3)
>>> a
[1, 3, 2, [3, 4], 3, 4]
A = ['xiaoWang','xiaoZhang','xiaoHua']
#修改元素
A[1] = 'xiaoLu'
nameList = ['xiaoWang','xiaoZhang','xiaoHua']
findName = input('请输入要查找的姓名:')
#查找是否存在
if findName in nameList:
print('找到了')
else:
print('没有找到')
>>> a = ['a', 'b', 'c', 'a', 'b']
>>> a.index('a', 1, 3) # 注意是左闭右开区间
Traceback (most recent call last):
File "" , line 1, in <module>
ValueError: 'a' is not in list
>>> a.index('a', 1, 4)
3
>>> a.count('b')
2
>>> a.count('d')
0
movieName = ['加勒比海盗','骇客帝国','第一滴血','指环王','霍比特人','速度与激情']
del movieName[2] #根据下标进行删除
movieName.pop() #删除最后一个元素
movieName.remove('指环王') #根据元素的值进行删除
>>> a = [1, 4, 2, 3]
>>> a
[1, 4, 2, 3]
>>> a.reverse() #降序
>>> a
[3, 2, 4, 1]
>>> a.sort()
>>> a
[1, 2, 3, 4]
>>> a.sort(reverse=True)
>>> a
[4, 3, 2, 1]
schoolNames = [['北京大学','清华大学'],['南开大学','天津大学','天津师范大学'],['山东大学',["新东方", "蓝翔"],'中国海洋大学']]
name = schoolNames[1][1]
print(name)
列表是可变的,元组是不可变的
键值对{key:value,…};字典是无序的,可变的
定义
my_dict = {key1:value1,key2:value2,…}
key值类型必须是不可变的(如列表、字典等都不可),且不能重复(才能完成1对1),一般都使用字符串
常见操作
修改元素/添加元素
格式:字典名[key] = value
如果key不存在,则添加一组键值对;如果key存在,则会覆盖此key原来的值
删除元素
>>> info = {
'name':'班长', 'sex':'f', 'address':'地球亚洲中国北京'}
>>> del info['name']
>>> print('删除后,%s' % info['name'])
Traceback (most recent call last):
File "" , line 1, in <module>
KeyError: 'name'
del info #删除整个字典
info.clear() #清空整个字典 结果为{}
len() 返回键值对的个数
keys 返回一个包含字典所有key的列表
values 返回一个包含字典所有value的列表
items 返回一个包含所有(键,值)元祖的列表
遍历
my_dict = {
"name": "小红", "age": 22, "no": "009"}
# 遍历-key
for key in my_dict.keys():
print(key)
# 遍历value
for value in my_dict.values():
print(value)
# 遍历items
for item in my_dict.items():
print(item[0])
# 通过设置两个临时变量
for key, value in my_dict.items():
print("key:", key)
print("value:", value)
# enumerate(列表名) 函数
# enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标
my_list = list("abcd")
# 不仅要获取列表中的元素 而且需要知道这个元素下标索引
for i, value in enumerate(my_list):
print(i,value)
变量名和值一一对应
可以把函数返回值直接拆包
name,age,no,address = ("zhangsan",20,1,"didian")
name,age,no,address = ["zhangsan",20,1,"didian"]
name,age,no,address = {
"name":"zhangsan","age":20,"no":1,"address":"didian"} #取到的是key值
#批量定义变量
num1, num2, num3, num4 = 10, 20, 30, 40
def 函数名(形参1,形参2,...):
函数体
# pass占位,防止错误
函数名(实参1,实参2,...)
# 对函数的简写
f = lambda a, b : a + b
print(f(10, 20))
# 等价于
# def add2num(a, b):
# return a + b
# 函数作为参数传递
# f = lambda x,y:x+y
def fun(a, b, opt):
result = opt(a, b)
print("result = %d" % result)
fun(1, 2, lambda x,y:x+y)
# 自定义排序(最外层肯定是列表)
# 格式: 列表名.sort(key=lambda 列表的元素(临时变量): 临时变量[key])
stus = [{
"name": "zhangsan", "age": 18}, {
"name": "lisi", "age": 19}, {
"name": "wangwu", "age": 17}]
# 按照年龄排序
stus.sort(key=lambda my_dict:my_dict["age"])
# 按照名字排序
stus.sort(key=lambda my_dict:my_dict["name"])
# 列表中的列表嵌套
my_list = [[10, 8, 9], [7, 10, 19], [9, 10, 29]]
# 按照列表元素(小列表)最后一个元素排序
my_list.sort(key=lambda new_list:new_list[2], reverse=True)
# 使用列表推导式 快速创建一个列表
my_list = [ i for i in range(1, 31)]
# 等价于
# my_list = []
# for i in range(1, 101):
# my_list.append(i)
# 得到一个有30个哈哈的列表
my_list = ["哈哈" for i in range(30)]
# 定义一个列表 保存数据[1, 50]之间的偶数
# 列表推导式
my_list = [ i for i in range(1, 51) if i % 2 == 0]
# 等价于
# my_list = []
# for i in range(1, 51):
# # 判断是否是偶数
# if i % 2 == 0:
# my_list.append(i)
#
# print(my_list)
# 打开一个文件 以只读方式 返回一个文件对象
# 如果使用r模式打开文件,如果文件存在,直接打开;如果文件不存在 会报错
f = open("hm.txt", "r")
# 关闭文件(打开一个文件就需要消耗内存)
f.close()
# 打开一个文件 以只写方式 返回一个文件对象;如果以w方式打开文件 会把原来文件的数据清空 然后在写入
# 如果使用w模式打开文件 如果文件存在 直接打开;如果文件不存在 会创建一个文件 然后打开
open("hm.txt", "w")
f.close()
# a 追加数据
# f = open(file_name, "a")
# f.write("nihao")
# f.close()
file_name = "hm.txt"
# <1>写数据(write)
# f = open(file_name, "w")
# f.write("hello world")
# f.close()
# <2>读数据(read) 如果使用字符串方便
# f = open(file_name, "r")
# ret = f.read()
# print(ret)
# f.close
# <3>读数据(readlines) 如果使用列表方便
# f = open(file_name, "r")
# 把每行的数据保存到列表中
# ret = f.readlines()
# print(ret)
# f.close()
# 中文读写
# f = open("hmhm.txt", "w", encoding="utf-8")
# # 写入数据
# # 默认情况下如果在windows电脑中(中国) 保存中文编码格式为gbk (mac电脑或者是linux 没有问题)
# # 如果其他字符 例如abcd 编码格式为utf-8
# f.write("你好世界")
# # 关闭文件
# f.close()
import os
# 文件/文件夹重命名
os.rename(old_fileName,new_fileName)
# 删除文件
os.remove(fileName)
# 创建文件夹
os.mkdir(dirName)
# 获取当前目录(绝对路径)
result = os.getwd()
# 改变默认目录
os.chdir("../")
# 获取目录列表
my_list = os.listdir()
# 删除文件夹
os.rmdir(dirName)
# 读取
# 通过此方式打开文件 不需要关闭
# as 是给文件起了名字
with open("hm.txt", "r", encoding="utf-8") as f:
result = f.read()
# 写入
f = open("hm.txt", "w", encoding="utf-8")
f.write("hello python!!!")
f.close()
# 读取
import xlrd
data = xlrd.open_workbook("student.xlsx")
# 获取列表
table = data.sheet_by_index(0)
# 获取所有的行数
nrows = table.nrows
# 获取所有的列数
ncols = table.ncols
# 获取第一行的数据
first_row_name_list = table.row_values(0)
print(first_row_name_list)
# 定义一个列表保存所有行的数据
info_list = []
# 遍历所有行
for rownum in range(1, nrows):
row = table.row_values(rownum)
if row:
info_list.append(row)
print(info_list)
# 写入
import xlsxwriter
# 打开student.xlsx文件
workbook = xlsxwriter.Workbook("student.xlsx")
# 创建一张工作表
worksheet = workbook.add_worksheet()
# 设置第一行信息
worksheet.write(0, 0, "学号")
worksheet.write(0, 1, "姓名")
worksheet.write(0, 2, "年龄")
# 学生信息列表
student_list = [{
"name": "小明", "age": 20, "no": "20170901001"},
{
"name": "小红", "age": 21, "no": "20170901002"},
{
"name": "小刚", "age": 20, "no": "20170901003"},
{
"name": "小海", "age": 23, "no": "20170901004"},
{
"name": "小阳", "age": 25, "no": "20170901005"}]
# 遍历列表
for i, info in enumerate(student_list):
# 写入数据
# write(第x行, 第x列, 写入的数据)
worksheet.write(i + 1, 0, info["no"])
worksheet.write(i + 1, 1, info["name"])
worksheet.write(i + 1, 2, info["age"])
# 关闭文件
workbook.close()
# 读取
import json
# 将json对象转成字典 -> 进行解码
with open("hm.json", "r", encoding="utf-8") as f:
# 获取文件中数据 -> 字典
new_dict = json.load(f)
# 查看类型
print(type(new_dict))
# 获取名字
print(new_dict["name"])
# 获取年龄
print(new_dict["age"])
# 获取学号
print(new_dict["no"])
# 写入
import json
# 定义一个字典
my_dict = {
"name": "老王", "age": 30, "no": "007"}
# 将字典转成json -> 进行编码
json_str = json.dumps(my_dict)
# 打印json字符串
print(type(json_str))
# 把json数据写入到文件中
with open("hm.json", "w", encoding="utf-8") as f:
f.write(json_str)
// xml示例文件
<list>
<music title="再见理想">
<format>盒带format>
<year>1986year>
<month>3month>
<stars>10stars>
<description>Beyond出品description>music><music title="光辉岁月">
<format>盒带format>
<year>1987year>
<month>1month>
<stars>9stars>
<description>Beyond出品description>music>
<music title="长城">
<format>盒带format>
<year>1992year>
<month>8month>
<stars>10stars>
<description>Beyond出品description>music><music title="海阔天空">
<format>盒带format>
<year>1993year>
<month>6month>
<stars>10stars>
<description>Beyond出品description>music>list>
# 读取
import xml.dom.minidom
# 定义一个变量保存文件名
file_name = "xml.xml"
#打开xml文档
domTree = xml.dom.minidom.parse(file_name)
# 返回文档的根节点
root = domTree.documentElement
# 返回带有指定标签名的对象的集合(在集合中获取所有电影)
musics = root.getElementsByTagName("music")
# 打印每部电影的详细信息
for music in musics:
print("------音乐------")
# 如果元素的属性为title
if music.hasAttribute("title"):
print("歌名: %s" % music.getAttribute("title"))
# 格式
type = music.getElementsByTagName("format")[0]
print("-格式: %s" % type.childNodes[0].data)
year = music.getElementsByTagName("year")[0]
print("-年份: %s" % year.childNodes[0].data)
month = music.getElementsByTagName("month")[0]
print("-月份: %s" % month.childNodes[0].data)
start = music.getElementsByTagName("stars")[0]
print("-星数: %s" % start.childNodes[0].data)
desc = music.getElementsByTagName("description")[0]
print("-描述:%s" % desc.childNodes[0].data)
区分
类和对象
# class Hero: # 经典类(旧式类)
# class Hero():
class Hero(object): # 新式类
def info(self):
print("英雄各有见,何必问出处。")
# object 是Python 里所有类的最顶级父类;
# 类名 的命名规则按照"大驼峰命名法";
# info 是一个实例方法,第一个参数一般是self,表示实例对象本身,当然了可以将self换为其它的名字,其作用是一个变量 这个变量指向了实例对象
class Hero(object): # 新式类
# 1、定义实例方法
def info(self):
"""当对象调用实例方法时,Python会自动将对象本身的引用做为参数,
传递到实例方法的第一个参数self里"""
print(self)
print("self各不同,对象是出处。")
# Hero这个类 2、实例化了一个对象 taidamier(泰达米尔)
taidamier = Hero()
# 3、对象调用实例方法info(),执行info()里的代码
# . 表示选择属性或者方法
taidamier.info()
class Hero(object):
def move(self):
"""实例方法"""
print("正在前往事发地点...")
def attack(self):
print("发出了一招强力的普通攻击...")
# 实例化了一个英雄对象 泰达米尔
taidamier = Hero()
# 给对象添加属性,以及对应的属性值
taidamier.name = "泰达米尔" # 姓名
taidamier.hp = 2600 # 生命值
taidamier.atk = 450 # 攻击力
taidamier.armor = 200 # 护甲值
# 通对.成员选择运算符,获取对象的属性值
print("英雄 %s 的生命值 :%d" % (taidamier.name, taidamier.hp))
print("英雄 %s 的攻击力 :%d" % (taidamier.name, taidamier.atk))
print("英雄 %s 的护甲值 :%d" % (taidamier.name, taidamier.armor))
# 通过.成员选择运算符,获取对象的实例方法
taidamier.move()
taidamier.attack()
class Hero(object):
def move(self):
print("正在前往事发地点...")
def attack(self):
print("发出了一招强力的普通攻击...")
def info(self):
"""在类的实例方法中,通过self获取该对象的属性"""
print("英雄 %s 的生命值 :%d" % (self.name, self.hp))
print("英雄 %s 的攻击力 :%d" % (self.name, self.atk))
print("英雄 %s 的护甲值 :%d" % (self.name, self.armor))
# 实例化了一个英雄对象 泰达米尔
taidamier = Hero()
# 给对象添加属性,以及对应的属性值
taidamier.name = "泰达米尔" # 姓名
taidamier.hp = 2600 # 生命值
taidamier.atk = 450 # 攻击力
taidamier.armor = 200 # 护甲值
# 通过.成员选择运算符,获取对象的实例方法
taidamier.info() # 只需要调用实例方法info(),即可获取英雄的属性
taidamier.move()
taidamier.attack()
魔法方法
__开头,__结尾的方法,是python内置的方法,在特殊情况下被python执行(python可以监听到你使用自定义类创建一个对象)
在自定义类中重写魔法方法
class Hero(object):
"""定义了一个英雄类"""
def __init__(self, name, skill, hp, atk, armor):
""" __init__() 方法,用来做变量初始化 或 赋值 操作"""
self.name = name
self.skill = skill
self.hp = hp
self.atk = atk
self.armor = armor
def move(self):
"""实例方法"""
print("%s 正在前往事发地点..." % self.name)
def attack(self):
print("发出了一招强力的%s..." % self.skill)
def info(self):
print("英雄 %s 的生命值 :%d" % (self.name, self.hp))
print("英雄 %s 的攻击力 :%d" % (self.name, self.atk))
print("英雄 %s 的护甲值 :%d" % (self.name, self.armor))
# 实例化英雄对象时,参数会传递到对象的__init__()方法里
taidamier = Hero("泰达米尔", "旋风斩", 2600, 450, 200)
gailun = Hero("盖伦", "大宝剑", 4200, 260, 400)
# 不同对象的属性值单独保存
print(id(taidamier.name))
print(id(gailun.name))
# 同一个类的不同对象,实例方法共享
print(id(taidamier.move()))
print(id(gailun.move()))
class A(object):
def __init__(self):
print("这是 init 方法")
def __new__(cls):
print("这是 new 方法")
return object.__new__(cls)
A()
# __new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供
# __new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例
# __init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值
# 我们可以将类比作制造商,__new__方法就是前期的原材料购买环节,__init__方法就是在有原材料的基础上,加工,初始化商品环节
class Hero(object):
def __init__(self, name, skill, hp, atk, armor):
self.name = name
self.skill = skill
self.hp = hp
self.atk = atk
self.armor = armor
def move(self):
print("%s 正在前往事发地点..." % self.name)
def attack(self):
"""实例方法"""
print("发出了一招强力的%s..." % self.skill)
def __str__(self):
return "英雄 <%s> 数据: 生命值 %d, 攻击力 %d, 护甲值 %d" % (self.name, self.hp, self.atk, self.armor)
taidamier = Hero("泰达米尔", "旋风斩", 2600, 450, 200)
gailun = Hero("盖伦", "大宝剑", 4200, 260, 400)
# 如果没有__str__ 则默认打印对象在内存的地址。
# 当类的实例化对象 拥有 __str__ 方法后,那么打印对象则打印 __str__ 的返回值。
print(taidamier)
print(gailun)
class Hero(object):
# 初始化方法,创建完对象后会自动被调用
def __init__(self, name):
print('__init__方法被调用')
self.name = name
# 当对象被删除时,会自动被调用
def __del__(self):
print("__del__方法被调用")
print("%s 被 GM 干掉了..." % self.name)
# 创建对象
taidamier = Hero("泰达米尔")
# 删除对象
print("%d 被删除1次" % id(taidamier))
del(taidamier)
gailun = Hero("盖伦")
gailun1 = gailun
gailun2 = gailun
print("%d 被删除1次" % id(gailun))
del(gailun)
print("%d 被删除1次" % id(gailun1))
del(gailun1)
print("%d 被删除1次" % id(gailun2))
del(gailun2)
继承
# 定义一个Master类
class Master(object):
def __init__(self):
# 属性
self.kongfu = "古法煎饼果子配方"
# 实例方法
def make_cake(self):
print("按照 <%s> 制作了一份煎饼果子..." % self.kongfu)
# 定义Prentice类,继承Master
class Prentice(Master):
# 子类可以继承父类所有的属性和方法
pass
# laoli = Master()
# print(laoli.kongfu)
# laoli.make_cake()
damao = Prentice() # 创建子类实例对象
print(damao.kongfu) # 子类对象可以直接使用父类的属性
damao.make_cake() # 子类对象可以直接使用父类的方法
class Master(object):
def __init__(self):
self.kongfu = "古法煎饼果子配方"
def make_cake(self):
print("[古法] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu)
def dayandai(self):
print("师傅的大烟袋..")
class School(object):
def __init__(self):
self.kongfu = "现代煎饼果子配方"
def make_cake(self):
print("[现代] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu)
def xiaoyandai(self):
print("学校的小烟袋..")
class Prentice(Master, School): # 多继承(Master在前)
pass
damao = Prentice()
print(damao.kongfu) # 执行Master的属性
damao.make_cake() # 执行Master的实例方法
# 子类的魔法属性__mro__决定了属性和方法的查找顺序
print(Prentice.__mro__)
damao.dayandai() # 不重名不受影响
damao.xiaoyandai()
class Master(object):
def make_cake(self):
print("按照 [古法] 制作了一份煎饼果子...")
class School(object):
def make_cake(self):
print(" 按照 [现代] 制作了一份煎饼果子...")
# 多继承,继承了多个父类
class Prentice(School, Master):
# 实例方法
def make_cake(self):
print("按照 [猫氏] 制作了一份煎饼果子...")
# 调用父类方法格式:父类类名.父类方法(self)
def make_old_cake(self):
# 调用父类Master的实例方法
Master.make_cake(self)
def make_new_cake(self):
# 调用父类School的实例方法
School.make_cake(self)
# 实例化对象,自动执行子类的__init__方法
damao = Prentice()
damao.make_cake() # 调用子类的方法(默认重写了父类的同名方法)
damao.make_old_cake() # 进入实例方法去调用父类Master的方法
damao.make_new_cake() # 进入实例方法去调用父类School的方法
damao.make_cake() # 调用本类的实例方法
class Master(object):
def make_cake(self):
print("按照 [古法] 制作了一份煎饼果子...")
class School(Master):
def make_cake(self):
print("按照 [现代] 制作了一份煎饼果子...")
# 执行父类的实例方法 -->可以直接在子类一个方法里面调用父类
super().make_cake()
class Prentice(School, Master):
def make_cake(self):
print("按照 [猫氏] 制作了一份煎饼果子...")
def make_all_cake(self):
# 方式1. 指定执行父类的方法(代码臃肿)
# School.make_cake(self)
# Master.make_cake(self)
# 方法2. super() 带参数版本,只支持新式类
# super(Prentice, self).make_cake()
# self.make_cake()
# 方法3. super()的简化版,只支持新式类
# 执行父类的 实例方法
super().make_cake()
damao = Prentice()
damao.make_cake()
damao.make_all_cake()
私有属性和私有方法
在属性和方法名前面加了2个下划线’__’,则表明该属性和方法是私有权限,否则为公有权限 -->类似java里的public&private
1. 类的私有属性 和 私有方法,都不能通过对象直接访问,但是可以在本类内部访问;
2. 类的私有属性 和 私有方法,都不会被子类继承,子类也无法访问;
3. 私有属性 和 私有方法 往往用来处理类的内部事情,不通过对象处理,起到安全作用。
class Master(object):
def __init__(self):
self.kongfu = "古法煎饼果子配方"
def make_cake(self):
print("[古法] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu)
class School(object):
def __init__(self):
self.kongfu = "现代煎饼果子配方"
def make_cake(self):
print("[现代] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu)
class Prentice(School, Master):
def __init__(self):
self.kongfu = "猫氏煎饼果子配方"
# 私有属性,可以在类内部通过self调用,但不能通过对象访问
self.__money = 10000
# 私有方法,可以在类内部通过self调用,但不能通过对象访问
def __print_info(self):
print(self.kongfu)
print(self.__money)
def make_cake(self):
self.__init__()
print("[猫氏] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu)
def make_old_cake(self):
Master.__init__(self)
Master.make_cake(self)
def make_new_cake(self):
School.__init__(self)
School.make_cake(self)
class PrenticePrentice(Prentice):
pass
damao = Prentice()
# 对象不能访问私有权限的属性和方法# print(damao.__money)
# damao.__print_info()
pp = PrenticePrentice()
# 子类不能继承父类私有权限的属性和方法
print(pp.__money)
pp.__print_info()
class Master(object):
def __init__(self):
self.kongfu = "古法煎饼果子配方"
def make_cake(self):
print("[古法] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu)
class School(object):
def __init__(self):
self.kongfu = "现代煎饼果子配方"
def make_cake(self):
print("[现代] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu)
class Prentice(School, Master):
def __init__(self):
self.kongfu = "猫氏煎饼果子配方"
# 私有属性,可以在类内部通过self调用,但不能通过对象访问
self.__money = 10000
# 现代软件开发中,通常会定义get_xxx()方法和set_xxx()方法来获取和修改私有属性值。
# 返回私有属性的值
def get_money(self):
return self.__money
# 接收参数,修改私有属性的值
def set_money(self, num):
self.__money = num
def make_cake(self):
self.__init__()
print("[猫氏] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu)
def make_old_cake(self):
Master.__init__(self)
Master.make_cake(self)
def make_new_cake(self):
School.__init__(self)
School.make_cake(self)
class PrenticePrentice(Prentice):
pass
damao = Prentice()
# 对象不能访问私有权限的属性和方法
# print(damao.__money)
# damao.__print_info()
# 可以通过访问公有方法set_money()来修改私有属性的值
damao.set_money(100)
# 可以通过访问公有方法get_money()来获取私有属性的值
print(damao.get_money())
多态
定义时的类型和运行时的类型不一样;python中弱化类型(重点在于对象参数是否有指定的属性和方法,如果有就认定合适,而不关心对象的类型是否正确 --> “鸭子类型”)
class F1(object):
def show(self):
print('F1.show')
class S1(F1):
def show(self):
print('S1.show')
class S2(F1):
def show(self):
print('S2.show')
def Func(obj):
# python是弱类型,即无论传递过来的是什么,obj变量都能够指向它,这也就没有所谓的多态了(弱化了这个概念)
print(obj.show())
s1_obj = S1()
Func(s1_obj)
s2_obj = S2()
Func(s2_obj)
# 类属性就是类对象所拥有的属性
class People(object):
name = 'Tom' # 公有的类属性
__age = 12 # 私有的类属性
p = People()
# 实例属性就是对象属性
class People(object):
address = '山东' # 类属性
def __init__(self):
self.name = 'xiaowang' # 实例属性
self.age = 20 # 实例属性
p = People()
# 若需要在类外修改类属性,必须通过类对象(Peole.name = 'xx')去引用然后进行修改。
# 如果通过实例对象去引用,会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性
class People(object):
country = 'china'
#类方法,用classmethod来进行修饰
@classmethod
def get_country(cls):
return cls.country
@classmethod
def set_country(cls,country):
cls.country = country
p = People()
print(p.get_country()) #可以用过实例对象引用
print(People.get_country()) #可以通过类对象引用
# 对类属性进行修改
p.set_country('japan')
print(p.get_country())
print(People.get_country())
class People(object):
country = 'china'
#静态方法
@staticmethod
def get_country(): #没有默认形参
return People.country
p = People()
# 通过对象访问静态方法
p.get_contry()
# 通过类访问静态方法
print(People.get_country())
- 实例方法(对象方法) -> 场景很多
- 定义格式: def 实例方法名(self):
- 调用格式: 对象名.实例方法名()
- 使用场景: 在方法中需要self
- 类方法-> 对私有类属性取值或者赋值
- 定义格式: @classmethod
def 类方法名(cls):
- 调用格式: 类名.类方法名() 或者 对象名.类方法名()
- 使用场景: 在方法中需要cls(类名)
- 静态方法 -> 一般不用
- 定义格式: @staticmethod
def 静态方法名():
- 调用格式: 类名.类方法名() 或者 对象名.类方法名()
- 使用场景: 在方法中不需要self 也不需要cls
# 实例化一个单例
class Singleton(object):
__instance = None
__is_first = True
def __new__(cls, age, name):
if not cls.__instance:
cls.__instance = object.__new__(cls)
return cls.__instance
def __init__(self, age, name):
if self. __is_first:
self.age = age
self.name = name
Singleton. __is_first = False
a = Singleton(18, "小明")
b = Singleton(28, "小明")
print(id(a))
print(id(b))
print(a.age)
print(b.age)
a.age = 19
print(b.age)
try:
执行可能发生异常的代码
except (异常类型1,异常类型2,...): #单个异常,多个异常,所有异常(except Exception:...)
如果发生异常执行的代码
try:
执行可能发生异常的代码
except (异常类型1,异常类型2,...)as 临时变量:
可以获得临时变量 #print("exceptions",e)
import time
try:
f = open('test.txt')
try:
while True:
content = f.readline()
if len(content) == 0:
break
time.sleep(2)
print(content)
finally:
f.close()
print('关闭文件')
except:
print("没有这个文件")
def my_func1():
try:
print(num)
except:
print("异常")
def my_func2():
my_func1()
def my_func3():
my_func2()
my_func3()