当前位置: 首页 > news >正文

常见的网站首页布局有哪几种教育类型网站

常见的网站首页布局有哪几种,教育类型网站,畅言 WordPress,wordpress调用具体文章python基础 文章目录 python基础python入门基础概念序列列表元组 -- 不可变序列字典字典的本质集合 控制语句选择结构 - 条件判断结构循环结构zip()推导式 函数及原理参数LEGB规则 面向对象私有属性和私有方法面向对象的特征重写__str__()方法super获得父类的定义特殊方法和运算…python基础 文章目录 python基础python入门基础概念序列列表元组 -- 不可变序列字典字典的本质集合 控制语句选择结构 - 条件判断结构循环结构zip()推导式 函数及原理参数LEGB规则 面向对象私有属性和私有方法面向对象的特征重写__str__()方法super获得父类的定义特殊方法和运算符重载组合 将父类对象作为子类的属性 python入门 turtle库的使用 import turtleturtle.width(50) # 字迹的宽度 turtle.showturtle() # 显示箭头 turtle.write(你好) # 写文字 turtle.forward(300) # 前进300像素 turtle.left(90) # 箭头左转 turtle.color(red) # 改变画笔的颜色 turtle.goto(-10,30) # 去坐标xy处 turtle.penup() # 抬笔不显示字迹 turtle.pendown() # 落笔显示字迹 turtle.circle(100) # 画圆参数是半径单位是像素 turtle.done() # 保持窗口基础概念 “\”行连接符把一行语句拆成多行便与观看 强制缩进表示层级结构不用{} del 变量名 清楚变量回收变量类似释放空间 python不支持定义常量只能你自己不去修改 解包赋值 a,b,c1,2,3 -- a1,b2,c3 等号左边写变量用逗号隔开右边写上值就会自动按顺序赋值 交互变量值a1,b2;a,bb,a;交换了ab的值 python里面的变量都是object对象的引用int a 1实际上是object aa.typeint,a.value1 object有三个基本成员变量id存地址的type存类型value存值。我们使用a的时候或者访问a都是使用了a的id。也就是指针 科学计数法314e-3 就是314乘以10的-3次方 /一个就是浮点数除法有小数部分两个//就是整数除法只保留整数部分不会四舍五入 divmod(13,3) —(4,1)使用这个函数可以同时得到商和余数返回的是元组 0b二进制0o八进制0x十六进制 int() 类型转换浮点数直接舍弃小数布尔值True1字符串类型的数字也可以直接转换—不能有非数字的字符 整数和浮点数运算会自动转化到浮点型 python3无最大数的上限int可以定义超大数 round(value) 返回一个四舍五入后的结果不会修改value需要重新接收 计算机的时间从1970年1月1号算起称unix时间点 python3里面的True和False本质上就是0和1可以把布尔值进行加减运算 bool(变量) 返回的是布尔值 可以使用连续比较运算if(3a10): print(a) 其他语言几乎不支持这种方式 bin(数值) 返回数值对应的二进制格式 列表进行乘法运算的时候就是几个列表拼接 字符串乘以某个数就是几个字符串拼接 不支持自增自减– 的本质是调用了eq方法 同一运算符is用来比较两个对象的id是否相等print(a is b) python会进行整数缓冲提前把一个整数数组创建起来你创建整型变量的时候是直接把数组元素的地址给变量 在命令行模式下缓存的范围是[-5,256] 在文件模式下就是无穷小到无穷大。文件模式下也有底层数组在但是超出范围的数以链表缓存到数组里面 在命令行模式下超出范围的数都是新建对象来储存哪怕数值一样也是不同的对象不同的id。文件模式下数值都被缓存是同一id 成员运算符in和not in。比如“py” in “python”很明显就是判断在不在里面有没有被包含。也可以判断一个数字是否在一个数组里面。返回值是布尔类型 运算符的优先级使用小括号自己分级就不会出错了 Python 对一些不可变的对象如整数、浮点数、字符串和元组进行了缓存以提高内存使用效率和性能。 字符串的内置函数ord() 将字符转换成对应的unicode码chr() 把十进制数字转换成对应的字符 使用三个单双引号定义的文本会按照你的格式原封不动的打印出来不会压缩 python默认使用的字符集是Unicode单个汉字也是单字符了 转义字符就是反斜杠在行末就是续行符\t是制表符\n换行符 直接把两个字符串放在一起默认进行拼接操作”a“”b“ 就是a“b” 在print打印的时候不想实现换行可以在print的参数里面使用end‘ ’ 在打印完内容之后会打印这个空格然后接着打印下一条语句默认end‘\n’。print(‘hello’,end’ ) input获取用户输入的信息 字符串不支持直接修改就是已经存在字符串不能像数组那样修改只能使用replace方法来修改参数1是被替换的字符参数2是替换后的字符replace也不能改变原来的字符串也是在原来的基础上进行替换重新生成字符串 print语句严格来说只能打印字符串内容平时可以输出各种类型的变量都是print语句默默进行了字符串转换 打印字符串的单个字符也被成为字符串索引就是下标从左到右从0开始从右到左从-1开始 字符串切片slice就是提取子字符串参数[起始偏移终止偏移量步长]左闭右开右边的字符取不到。如果范围超了就是把后面所有字符都拿到超的不管 [:] 提取整个字符串也就是原封不动[a:]提取字符串下标a开始到结尾的所有内容[:b]提取字符串从头开始一直到下标为b的位置如果b超了就是全部的字符串了超了就当len-1[a:b]提取字符串下标为a到b的所有内容[a️c]提取字符串下标从a到b的所有内容每隔c个字符取一个字符[-a:] 提取字符串的最后a个字符[-a:-b]提取字符串倒数a到b的字符[::-1]字符串逆序没有这个slice方法是靠”字符串[]“实现的这个切片操作适用于列表元组字符串等等一模一样的 split()分隔join()合并 split按照参数里面的字符串进行切割默认是按照空格字符切割并把切割后的字串放在列表里面‘’.join(列表) 参数里面写列表在前面的字符串里面写链接字符串的标志加星号就是”子串1*子串2*子串“join函数的原理和一样但是使用每使用一次就会新建一个对象join只会新建一次更灵活 字符串是一个常量跟数字一样当成常量储存也叫字符串的驻留机制。这个概念没啥用。略过即可 字符串函数 a.len() 求字符串长度 a.startswith() 判断字符串的开头是不是以参数开头的 a.endswith() 判断字符串是不是以参数结尾返回值是布尔值 a.find() 返回字符串中参数第一次出现的位置 a.rfind() 返回字符串中参数的最后一次出现的位置也就是倒着找 a.count() 返回字符串中参数出现的次数 a.isalnum() 判断字符串里面都是字母或数字返回布尔值 a.strip() 去除字符串首尾的指定信息如果不写参数就是去除字符串首尾两端的空格如果是一大堆空格就会一直删直到不是空格除了首尾之外的字符不管 a.lstrip() 去除左端指定的字符 如果是相连的就会连续去除 a.rstrip() 去除尾端指定的字符 下面的函数是新建一个字符串 a.capitalize() 首字母大写a.title() 每个单词的首字母大写a.upper() 所有字母大写a.lower() 所有字母小写a.swapcase() 大小写互换大写变小写小写变大写 字符串排版函数 a.center(排版后字符串长度”填充的字符“) 居中对齐*abc**如果填充的字符为空没写这个参数就是用空格代替a.ljust(字符串长度”填充的字符“) 靠左对齐 ***abca.rjust(字符串长度“填充的字符”) 靠右对齐 abc*** 字符串特征—返回布尔值 isalnum() 就是is all number 都是数字或字母吗isalpha() 检测字符串都是字母或者汉字isdigit() 只有数字isspace() 都是空白字符isupper() 都是大写字母islower() 都是小写字母 字符串格式化format 可以设计一个字符串的模板然后使用format调用这个模板并填入参数即可模板a “{0}是{1}的” 调用a.format(“小红”,‘好样的’) 输出小红是好样的的模板里面的{0}{1}就是要替换的地方这个位置可以颠倒参数按照顺序填入他们在花括号里面可以写参数名字,比如{name}后面在替换的时候可以指定参数填充format(name“小红”){1:*^10} 在模板里面也可以对参数进行对齐和填充两个操作 这里的冒号左边是索引右边第一个是对齐的时候填充的字符后面的分别是居中对齐^左对齐,右对齐。最后就是填充之后的字符串长度{1:*^6} 参数二填充的地方使用*进行填充对齐对齐方式是居中对齐对齐后是长度为6的字符串 数字格式化 浮点数用f整数用d {:.2f} 3.14 就是小数点后保留两位效数{:.2f} 3.14 带符号保留小数点后两位{:.0f} 3 不带小数{:02d} 05 整数左侧补零宽度为2{:x4d} 5xxx 整数右侧补x宽度为4{:,} 1,000,000 用逗号分隔的科学计数法{:.2%} 25.00% 百分比格式{:.2e} 1.00E09 指数格式{:10d} 13 默认右对齐宽度为10{:10d} 13 左对齐宽度为10{:^10d} 13 居中对齐宽度为10 可变字符串io.StringIO()或者数组 需要导入io模块使用a io.StringIO(字符串)直接打印a是一个object对象想要查看这个字符串使用函数a.getvalue() 就可以打印字符串的内容了修改字符串内容使用.seek(num) num是一个指针使用seek把指针移动到了字符串下标为num的地方再使用.write(“***”)就可以修改字符串的内容了前面指定了位置write的参数是代替的字符内容 类型转换总结 int() 整型long() 长整数float() 浮点数complex() 创建复数str() 字符串repr() 表达式字符串eval() 计算表达式返回对象Complex() 参数转化为复数tupls() 序列变元组list() 序列变列表set() 可变集合dict() 字典参数必须是元组格式frozenset() 不可变集合chr() 整数变字符unichr() 整数变Unicode字符ord() 字符变整数hex() 整数变十六进制oct() 整数变八进制 序列 包含列表元组字典集合字符串 在python当中的序列本质上是一个指针数组指针数组的每一个元素都指向一个对象 列表 列表 存储任意数目任意类型的集合 内置可变序列包含多元素的有序连续内存空间元素是任意类型的内容可大可小自动变换 列表的操作方法 append(元素) 增加元素至尾部extend(新增列表名) 增加列表到尾部在原列表上操作insert(元素下标) 增加元素在指定位置 从0开始 尽量不使用直接在尾部操作最好remove(元素) 删除指定元素 不存在就报错pop(元素下标) 默认删除并返回最后一个元素可以指定元素下标clear() 删除所有元素但不删除列表对象index(元素) 返回第一个指定元素的下标 index(value,start,end) 写一个参数是找参数出现的位置写两个参数第二个参数是找元素的时候的起始位置第三个参数是找元素最后的截止位置截止位置不算 count(元素) 计数返回指定元素出现的次数可以判断变量在不在列表里面和”变量 in 列表“的效果一样len(列表名) 求长度、个数这个不是列表的方法是一个函数参数写列表reverse() 翻转列表sort() 排序列表copy() 返回列表的浅拷贝列表元素 对一个列表使用也可以添加元素到列表尾部但是是对原列表进行复制在拷贝列表中新增元素有一个复制的操作效率低*列表对一个列表做乘法就跟对字符串做乘法一样产生新对象复制列表整体列表的删除使用 del 列表名[元素下标] 列表的创建 使用[]使用list() 如果参数为空就是空列表参数写range(10) 就是一个从0到9的列表没有10 range(start,end,step) 第一个参数是起始的数字默认是0可以不写第二个参数是结尾数字必写第三个参数是步长默认是1如果步长是负数就是从大到小输出内容-1就是逆序给列表如果填两个参数要保证起始小于结束的数值如果第三个参数是负数要保证起始大于结束 如果参数写一个字符串列表就是把字符串按照单个字符储存 推导式生成列表 a [x*2 for x in range(5)] [0,2,4,6,8] 这种就是推导式生成的列表a [x*2 for x in range(5) if x%4 ! 0] 在上面的基础上还加了一个if判断条件是对4取余不等于0符合条件的进入列表 print(range(5)) 输出的结果是range(0,5) range实际上是一个可迭代的对象只能给循环或者列表使用不可以直接进行乘除操作 range(5)*5 是错的 复制新列表 如果只是把原有的列表名赋值给新变量这个新变量只是一个指针没有新列表新列表 [] 列表名 用空列表对原列表进行加法运算就可以产生新列表了还有copy模块 列表排序有两种 修改原列表使用sort方法也可以在sort里面传参reverseTrue就是降序使用random.shuffle(列表) 打乱原列表顺序新建列表排序使用内置函数sorted(列表) 返回一个排好序的新列表实现降序也是传参reverseTrue,原列表不变reversed() 返回的是一个迭代器需要使用list方法加工一下才是列表。这是原列表的逆序列表迭代器 max和min函数 max取出列表的最大元素min取出最小元素 sum 对列表进行求和运算 元组 – 不可变序列 元组和列表一样列表是可变序列可以增删改操作元组是不可变序列不可增删改。只能查看计数 只需要学会元组的创建删除访问计数即可 元组的创建a (1,2,3) / a 1,2,3这两种方式的效果是一样的如果创建元组的时候只有一个元素这个元素后面必须跟一个逗号 比如(100,) 如果没有这个逗号就是整型100tuple(可迭代对象) 和list() 的操作一样参数为空字符串range列表 都可以list也可以接收元组作为参数因为元组不可修改想要对元组进行排序只能新建使用方法sorted(元组)会把原来的元组进行排序放在新的列表里面 zip函数 zip(列表a,列表b,列表c) zip的参数是多个列表他的返回值是zip对象可以使用list方法配合print打印出来 zip的返回值类似一个大列表他里面的每一个元素都是元组元组的元素是不同列表同一位置的元素 a [1,4,7] b [2,5,8] c [3,6,9,10] print(list(zip(a,b,c))) [(1, 2, 3), (4, 5, 6), (7, 8, 9)] 因为是list函数使用tuple就是元组了不难发现zip返回值的第一个元素是一个元组元素是每个列表的第一个元素。同理第二个元组的内容是每个列表第二个元素的集合 生成式推导元组只能用一次本质上不!元组是元组生成器 a (x*2 for x in range(10)) b tuple(a) print(b) c tuple(a) print(c) # 空和列表的生成式推导一样根据你写的逻辑生成一个序列。但是这个生成器不能多次使用只能用一次明明a一直是一个生成式元组没有修改但是b使用过一次ac就不能使用a了 把a的外壳改成列表就可以多次使用了bc都能正常访问 生成式元组可以使用生成器自带的函数进行遍历同样的只能遍历一次使用a.——next——()就可以依次得到元组的元素了 元组的访问速度比列表快 与整数和字符串一样可以作为字典的键列表不可以成为字典的键 字典 是 键值对 的无序可变序列每个元素都是键值对。 通过键可以对值进行查改操作 键不可以重复如果重复了最后相同的键只会出现一次他的值是最后一次的值先前的都覆盖了 键 必须是不可变对象也不能重复出现一般是整数元组字符串浮点数 值 可以是任意类型数据可以重复出现 创建字典的方式 使用花括号直接创建 使用dict()函数 a {name:小黑,age:20} b dict(name小红,age21) c dict([(name,小红),(age,22)])print(a) print(b) print(c)上面是创建字典的三种方式c几乎不用b还凑合a比较常用。a是最经典的方式b可以省去键的引号参数不写就是空字典 使用zip函数利用zip函数的特性我们把 键和值分别写在两个列表里面然后再使用zip操作最后使用dict对zip的返回值操作 a [name,age] b [小白,20] c dict(zip(a,b))print(c) {name: 小白, age: 20}上面是zip配合dict的效果 使用dict.fromkeys([各种键]) 方法 需要在参数里面填写各种键构成的列表直接打印就是一个所有值为None的字典{‘name’:None,‘age’:None} 字典元素的访问 a[键] 就可以获得这个键的值如果键不存在就报错 a.get(键默认值) 这个参数一般写一个也就是键返回 值第二个参数是键不存在的时候返回的内容默认是None不会报错。也可以自己设定键不存在时返回的提示词 字典的函数 a.items() 输出整个字典的键值对dict_items([(键值对)(键值对)]) 外面这一堆是自动补充的格式,键值对在元组里面以逗号隔开a.keys() 输出字典中所有的键 dict_keys([键]) 用逗号隔开的键a.values() 输出字典中所有的值 dict_values([值]) 用逗号隔开的值字典也可以用len函数结果是键值对的个数也可以使用in来判断键是否在字典里面只能判断键不能判断值在不在字典里面 字典元素的增删查改 新增键值对 若键存在会覆盖旧的值不存在就新增键值对 a[‘age’] 18 直接用字典名加中括号和键赋值 值就可以在字典里面新增键值对了 新增字典加到旧字典里面使用函数update() a.update(b) 这里ab都是字典现在是把b的键值对添加到a里面去 删除键值对 del(a[‘name’]) 直接删除b a.pop(‘age’) 删除键值对并返回删除的键值对的值a.clear() 使用字典自带的clear方法就可以清空字典了a.popitem() 这个方法是在字典里面随机去除一个键值对因为字典无序所以是随机删除键值对 序列解包 用于元组、列表、字典。 a {name:哈哈哈,age:15,id:10} x,y,z a.items()键值对 返回元组 x[0] 就是键 x,y,z a.keys()键 x,y,z a.values()值 print(x,y,z)使用字典的这三种方法分别可以得到字典里面的键值对、键、值 上面这种得到字典数据的方式叫序列解包 字典的本质 本质是散列表。就是一个两列的二维数组。对应字典的键值对。散列表数组里面的元素不是紧密相连的每一个单元都是有间隔的。可以自动扩容mallco。 每个键值对也叫一个单元bucker 集合 本质上是一个只有键的字典。因此集合内部不能有重复的元素 集合跟字典一样无序可变不可重复 a.add(元素) 使用add函数可以在集合里面添加新元素使用set(可迭代的对象)方法可以把列表、元组等可以迭代的对象转换成集合。set可以删除重复数据保留一个remove(元素) 可以删除集合中的指定元素clear() 清空集合 集合的操作 并集 a|ba.union(b) 交集 aba.intersection(b) 差集 去掉共同的部分应该是按照后面的这个公式理解a-b a - (ab) a-ba.difference(b) 控制语句 分三类顺序、选择、循环 选择结构 - 条件判断结构 单分支if 双分支if else多分枝if elif else 条件语句判断为False的情况 False 00.0None空序列空列表空元组空集合空字典空字符串空的range空迭代对象 除了上面的情况均为True条件语句中不允许出现赋值运算符就是一个等号进行赋值操作不允许三元条件表达式 条件为真的结果 if (条件语句) else 条件为假的结果 print(num if num20 else num-10) 在多分枝里面else不是必要存在的可以只有if和elif 循环结构 python里面的可迭代对象 序列字典列表元组字符串迭代器生成器文件 遍历字典的时候如果直接写字典名就是遍历字典的键key想要遍历字典的值就需要对字典调用对应的方法keys()啥的 break 跳出最近的循环循环结束 continue 结束本次循环循环不结束直接进入下一次循环 else 语句如果while和for循环不是break语句结束的就会执行else语句 比如下面的两段代码第一个是正常结束for循环就会执行else语句第二个就不执行else语句 for i in range(5):print(i) else:print(done)for i in range(5):print(i)if i 3:break else:print(done)循环的优化 尽量减少循环内的计算 嵌套循环最内层尽量少的计算 尽量使用局部变量 使用join()连接字符串 zip() 这是一个迭代器类似range 同时遍历多个序列提取元素赋值给变量按最短的序列结束循环 aa [1,2,3,4] bb [q,w,e,r] cc [9,8,7] for a,b,c in zip(aa,bb,cc):print(a,b,c)for i in range(min(len(aa),len(bb),len(cc))):print(aa[i],bb[i],cc[i])zip函数遍历了三次因为最短的序列是cc只有三个元素。 不难发现zip就是range和min函数的结合 推导式 列表推导式 [表达式 for 变量 in 可迭代对象]{表达式 for 变量 in 可迭代对象 if 条件判断} 字典推导式 {key表达式:value表达式 for key,value in 可迭代对象 }{key:value for key,value in zip(range(1,5),[‘a’,‘b’,‘c’,‘d’])}利用字符串的count方法可以得到参数里面字符出现的次数 sign_num {sign:a.count(sign) for sign in a} 利用键的不重复性就可以得到字符的字典集合 集合推导式 把列表推导式的中括号变成花括号就是集合推导式了里面的元素是乱序的因为集合无序生成器推导式 把列表生成器的中括号变成圆括号就是元组但是不能直接使用是一个迭代对象需要再次遍历一遍也只能使用一次这个推导式的返回值是一个类似range的对象还要遍历。只能使用一次是一次性的消耗品 函数及原理 def 函数名([参数列表]): # 用中括号括起来的意思是可有可无在pycharm里面在函数体内打三个单引号回车可以自动解释说明就是方便写注释了:param a:这是第一个参数。。。:param c::return:函数体在python里面某某函数也叫某某方法 使用函数help(函数名) 可以打印函数声明格式解释说明也就是这个注释可以打印出来 使用函数的__doc__这个内置函数也可以打印注释信息这个不打印函数声明。这里的注释仅包括长文本注释即三引号的 python里面一切变量都是对象函数也是一个对象。 python里面没有指针变量就是指针把函数名交给一个变量这个变量也就函数指针。 def add(n):n n1 c add c(2) 可以直接当成函数指针使用函数名后面加圆括号就是调用该函数 函数内部使用全局变量需要使用global声明一下函数内部直接访问全局变量不需要global声明但是想要修改全局变量就要global声明 locals()获取函数内部所有的局部变量 globals()获取所有的全局变量/对象。以字典的格式返回 局部变量调用速度比全局变量更快 因为python都是对象所有的数据的创建都是引用没用赋值操作。 如果操作的对象是可变对象我们修改他的值就是直接修改。如果不是可变对象就是新建对象比如元组 不可变对象数字、字符串、元组、函数等 id(变量) 可以得到对象的地址 因为都是对象都是引用关系所以传参的时候也是传引用也就是指针指向同一个地址/对象 浅拷贝copy只拷贝对象的引用深拷贝deepcopy是对对象所有内容进行拷贝 浅拷贝只复制了对象的第一层结构例如第一层的列表或字典而对包含的对象的引用仍然指向原始对象中的元素 如果不可变对象内含有可变对象比如元组里面嵌一个列表修改这个列表的值不会创建新的元组对象来储存还可以继续使用这个元组对象地址不变 参数 参数有5类 位置参数 就是函数需要几个参数就传几个参数默认值参数 写函数参数的时候直接给参数先赋值如果传参不够就使用你设定的数也就是默认值 add(a,b,c1,d2) add(1,2) 默认值参数只能在位置参数后面 命名参数 如果函数的参数是add(a,b,c) 传参的时候可以手动命名add(b1,c2,a3) 对应的函数里面的参数能得到相应的值可变参数 也要把可变参数放在位置参数后面 *a 一个星号将传过去的多余参数放在元组对象里面函数add(a,b,*c) 调用的时候是add(4,5,6,7) 最后是a4,b5,c (6,7)**a 俩星号 将多余的参数放在字典对象里面这个多余的参数要以‘参数名参数’的形式传递 强制命名参数 如果把可变参数放在命名参数之前就可以构成强制命名参数。add(*c,a,b) add(14,7,2,a5,b8) c得到了(14,7,2) lambda表达式 匿名函数 基本语法lambda 参数1参数2参数3。。。 表达式/函数体f lambda a,b,c:abc print(f(10,20,30))----- 60把匿名函数写在列表里面使用列表加中括号的形式再跟一个圆括号写参数就可以调用匿名函数了。比如g[1](10)g是一个匿名函数列表[1]是他的第2个匿名函数后面是参数。就可以得到返回值了lambda是关键词会生成函数对象和正常的函数一样 eval函数把字符串参数当成代码语句使用 eval(‘print(123)’) 就是正常输出123 eval(‘ab’,num1) 这里面还可以执行表达式如果不写第二个参数指定参数的来源就会从代码里面找参数然后执行如果指定了参数的来源比如这里是num1说明参数在这里面就会从num1里面拿参数的值并计算 因为eval会把字符串转换成语句执行而字符串里面可能含有不安全的语句。 在函数内部再定义一个函数就是内部函数也叫嵌套函数一般是加密的地方。内部函数只能在这个函数里面使用。出了函数就无法访问了 global声明全局变量 nonlocal声明函数里面内部函数之外的变量。对于内部函数而言不在内部函数里面但在整个函数里面的变量就是内部函数的外部变量需要使用nonlocal声明。当然也是修改变量的时候才要声明仅访问是不需要声明的。 a 1def add():b 2def num():nonlocal b 声明内部函数的外部变量global a 声明全局变量LEGB规则 python在查找变量的时候的规则 Local-》Enclosed-》Global-》Built in分别是函数内部内部函数外部变量全局变量python的特殊名称。一般最后一个用不上全局变量都没找到就直接报错了 面向对象 数据的集合就是数组数组的集合就是结构体结构体和方法发集合就是对象。 类的对象object和类的实例instance是一个意思 类里面的变量叫类的属性类里面的函数叫类的方法 init构造方法是对象的初始化工作。构造函数不是建房子而是粉刷房子。new方法是建房子 init的第一个参数只能是self后面跟其他参数。初始化的意思是给实例的属性赋值 如果不写这个函数系统也会自我生成一个无参版的构造函数 new方法一般不用写也是自己生成的方法。 class Student:def __init__(self,age):self.age agedef print_info(self):self.num 100 这个函数不被调用这个属性不会被添加但这是类里面的属性只要调用就有s1 Student(Tom) s2 Student(Jerry) s2.address beijing 以这种方式也可以给s2对象增加属性但是只有s2才有这个新增的属性s1没有因为不是添加到类里面的属性调用对象方法的表达式对象.方法([参数列表]) 传参的时候不用写self系统会自动添加 dir(对象) 获得对象的全部属性和方法 对象.dict 获得对象全部属性以字典的格式 isinstance(对象类型) 判断参数一是不是参数二的类型 类对象的类型是type类意思是图纸类模板类 类只要被定义了就会生成类对象后面使用不使用没关系 类对象是类对象类的实例化对象是实例化对象两个不一样 class Student:count 0def __init__(self,age):self.age age 这里是给类的实例化对象赋值也就是实例属性Student.count Student.count 1 这里是给Student类对象赋值就是类属性def print_info(self):self.num 100 类方法 通过装饰器定义 必须要有cls classmethod 这个就是装饰器 def 类方法名(cls [,形参列表]): 第一个是cls必须有是关键词方法体类方法不能访问实例属性和实例方法 class Student():def __init__(self, name, age):self.name nameself.age agedef getName(self):print(self.name)classmethoddef getAge(cls):print(15) 这个就是类方法的类函数不能访问实例化对象的值。比如self.age不可以的。Student.getAge() 这是调用类的类方法静态类方法 staticmethod 不需要传参跟普通函数一样只是写在了类里面需要用类来调用。也不能访问实例属性 class Student():def __init__(self, name, age):self.name nameself.age agedef getName(self):print(self.name)staticmethoddef getAge():print(15)staticmethoddef add(a,b):print(a b)Student.getAge() Student.add(11, 22) 只是需要使用这个类来调用这个函数这个函数寄存在类里面析构函数del 垃圾回收机制释放空间的。python自动回收一般不用管。del 实例化对象就可以销毁这个对象释放空间 。del对象语句的本质就是调用了类里面的del析构函数 call方法 我们在python里面调用函数的时候都是函数名加括号。本质上是调用函数这个对象然后再调用函数对象里面的call方法 所以类也可以设计call方法把类像函数一样直接调用 class Student():def __call__(self, age, number):print(call)print(f{age}...{number})s Student() 类的实例化对象 s(15,20) 对象名()python不支持重载就是类里面的方法名称不能一样如果方法的名称有一样的就以最后一个为准。也只能调用最后一个同名的方法。 可以使用赋值的方式给类增加方法由于类方法在调用的时候默认传参self也就是至少一个参数所以我们需要把要添加到类里面的函数设置一个参数哪怕不使用也要留一个。如果有参数就不用管了。 python还支持给类增加函数这个叫方法的动态性 class Student():def add(self):print(add)def work(s):print(work)def add(a):print(add2) Student.work work 给Student类增加了一个方法 Student.add add 这里替换了类原本的add方法q Student() q.work() q.add()私有属性和私有方法 python里面没有严格的私有方法。在类外面也可以访问类的私有属性或者方法。 一般是约定在类外面不要访问类内部的属性或方法。 关于约定 双下划线开头的属性是私有的。类里面可以访问私有属性类外面不能直接访问私有属性方法。只是不能直接还是有方法的在类的外面使用下划线开头类名双下划线私有属性/方法 访问私有属性/方法 class Student():num 0__age 10 私有属性在预处理的时候变成了_Student__agedef __init__(self, name):self.__name name 实例对象的方法里面也可以设置私有属性def print_num(self):print(Student.__age)类里面访问类属性print(self.__name) 在类里面访问实例对象的私有属性 print(Student.num) print(Student._Student__age) 类外面访问私有属性 s Student(John) print(s._Student__name) 在类外面访问实例化对象的私有属性函数的本质也是一个属性访问私有方法的步骤和访问私有属性是一样的 property装饰器 作用在调用类方法的时候不需要使用括号执行了就是省了括号 class Student():num 0def __init__(self, name, age):self.name nameself.age agepropertydef getName(self):print(self.name)getName.setter 这个装饰器的工作是验证我们想要修改类属性的值是否合法def getName(self,name):if name: 这里可以验证一下name是不是空值self.name nameelse:print(ERROR) 如果格式不规范就不可以更改a Student(John, 18) a.getName zhao 这里是这个装饰器 getName.setter a.getName 这里是调用了这个装饰器 property因此不用括号就可以执行方法name.setter: 这个装饰器定义了用于设置 name 属性的方法。当你使用 student.name NewName 的形式来给 name 属性赋值时实际调用的是 name 方法下的 setter。 setter 方法允许你在设置属性值的时候执行一些额外的操作比如验证输入值的类型。 一个下划线开头的是保护成员就是不能使用from import导入 双下划线开头的是私有成员。 双下划线开头结尾的是特殊成员 一般把相邻的方法使用一个空行隔开相邻的类使用两个空行隔开 None也是一个对象类型是NoneType也是一个常量。只能赋值不能人为创建这个类型。表示不指向任何对象。 None不是false、0、‘空字符串’。None和任意类型比较都是False 使用和is判断空列表()[]空字符串不会自动转成False 面向对象的特征 封装/隐藏 隐藏对象的属性和细节对外提供方法。对外暴露相关调用方法 继承 让子类拥有父类的属性或者方法提高代码的利用效率。保证父类不变的情况下增加新功能改进已有的算法 改善已有的类 格式class 子类类名(父类如果有多个就用逗号隔开): 如果我们没用指定父类就会默认指向object类。 如果子类不重写构造函数默认是自动调用父类的构造函数 class Person:def __init__(self, name, age):self.name nameself.age ageprint(Preson)class Student(Person):def __init__(self, name, age, num):# super(Student,self).__init__(name, age) 方法一Person.__init__(self, name, age) 方法二 这是两种继承父类构造函数的方法self.num num 子类独有的属性继承父类属性的同时也有自己的属性print(Student)a Student(John, 22, 80)因为在父类的构造函数里面有我们子类可以使用的初始化属性然后我们使用super或者方法二就可以使用父类的初始化了还能再添加新的属性num 父类的私有属性也可以继承 子类可以覆盖父类的方法这个操作叫方法重写 使用类方法类对象.mro() 或者类属性__mro__可以得到类的继承层次就是打印继承的父类的类名 子类可以继承父类中除构造方法外的所有成员 多态 由于对象的不同产生不同的行动输出不同的内容。 方法才有多态属性没有多态 多态存在的必要条件继承、方法重写 class Person:def say(self):print(Person says)class Student(Person):def say(self):print(Student says)class Teacher(Person): 就是两个子类继承同一个父类然后在子类里面分别定义相同名称的方法。def say(self):print(Teacher says)def say_name(m): 再用别的方法去调用上面两个子类的方法m.say()say_name(Student()) 因为传入的类不同所以调用的方法也不同这就是多态 say_name(Teacher())object类 使用快捷键alt7在pycharm里面可以看到类的层级还可以看到类的所有方法 灰色的方法是继承父类的白色的方法是这个类自己的 按住ctrl键鼠标移到想要看的类上面点击一次就可以自动跳转到这个类的构造函数所在的位置 类方法也是类属性我们在使用类方法的时候把括号去掉也可以得到值得到的是一个method类型类方法的属性是method 重写__str__()方法 我们把一个对象转换成字符串的时候本质上是调用了str这个方法我们使用print函数去直接打印这个对象的时候也是调用了str这个方法 class Student(Person):def __init__(self, name, age, num):# super(Student,self).__init__(name, age)Person.__init__(self, name, age)self.num numprint(Student)def __str__(self):print(重写str) 只要调用str方法我们就可以看到这句话return 重写的str返回内容a Student(John, 22,80) print(a) 这是打印的str返回值 str(a) 这里没有打印str的返回值只是调用了str方法多重继承一个子类可以有多个父类。比较复杂尽量少用。在类名后面的括号里写什么类什么类就是这个类的父类。存在多个父类的时候我们调用父类的方法是从左到右依次去查找。class st(bb,aa): 会先从bb里面找调用的方法找不到就去aa里面找。 super获得父类的定义 在子类中获得父类的方法 获得父类的构造方法super(子类的名称,self).–init–(参数列表) 第一个括号里面的参数可以不写一般是默认继承父类当然只适用于python3的简单继承。python2里面就是上面这种写法。 这个子类的名称就是super所在的这个类的名称 特殊方法和运算符重载 因为python里面都是对象我们进行运算的时候都是使用对象里面的方法。 ab a.__add__(b) 本质比如上面两个语句是同一个意思。第一行是我们直观的用法第二行是完整的写法 常见特殊方法 __init__ 构造方法 __del__ 析构方法 __repr__,__str__ 打印转化 __call__ 调用执行 __getattr__ 点号运算 本质是a.say --- a.__getattr__(say) __setattr__ 属性赋值 __getitem__ 索引运算 a[3] a.__getitem__(3) __setitem__ 索引赋值 __len__ 长度运算符的方法 add - sublt le eq! gt ge ne | ^ or xor andlshift rshift * / % // mul truediv mod floordiv ** pow特殊属性 obj.__dict__ 对象属性的字典 obj.__class__ 对象所属的类 class.__bases__ 类的直接父类多继承 class.__base__ 类的父类单继承 class.__mro__ 类的层次结构 class.__subclasses__ 类的子类列表组合 将父类对象作为子类的属性 class Person:def say(self):print(Person)class Student(Person):def stu(self):print(Student)class Teacher(Person):def tea(self):print(Teacher)class st:def __init__(self,s,t): 就是把实例对象初始化为自己的属性然后调用实例对象间接调用实例对象的方法self.s sself.t ta Student() b Teacher() 这是两个实例化对象 s st(a,b) 把实例化对象传给st自己的属性 s.s.stu() s.t.tea()和继承差不多。 class Person:def say(self):print(Person)class Student(Person):def stu(self):print(Student)class Teacher(Person):def tea(self):print(Teacher)class st(Student, Teacher):passs st() s.stu() s.tea()关于继承和组合的使用场景 如果是从属关系就用继承。如果是包含的关系就用组合。比如手机有屏幕就是组合。 工厂模式和单例模式 工厂模式就是用一个函数根据参数的不同返回不同的类对象使用ifelse语句判断。单例模式就是利用类对象属性比如把类属性弄成布尔值然后自己在初始化实例对象的时候修改一下类属性然后每次初始化的时候都要验证一下类属性。如果是第一次就正常创建否则就继续返回第一次创建的对象。
http://www.hkea.cn/news/14411328/

相关文章:

  • 想做一个驾校的招生网站应该怎么做手机网站制作步骤
  • 北京门户网站开发河南省罗山县做网站的公司
  • 有专门做网站的吗cms是啥
  • 电白手机网站建设公司陵水网站建设介绍
  • wordpress 修改站点wordpress关联adsense
  • 产品展示型网站赏析建立网站目录的时候
  • 做铁合金用哪个外贸网站好阿里巴巴怎么做不花钱的网站
  • 长沙做网站设计的公司建立百度网站
  • 常用网站缩略图自定义新媒体营销思维
  • 电商型网站设计企业优秀排版设计画册
  • 企业网站建设三网合一让网站打开更快
  • 建站公司主要做那些业务购物网站开发周期
  • 在线构建网站蒙阴蜜桃
  • 甘肃省建设厅安全员官方网站马鞍山 网站建设 有限公司
  • 简单的网站怎么做重庆荣昌网站建设价格
  • 北京科技网站制作中华室内设计网官网
  • 站长工具查询官网高安网站建设
  • wordpress怎么做站内站中国机械加工网18易0下6拉en
  • 做网站公司的年终总结漳平网站编辑价格
  • 渭南免费做网站公司seo网站排名优化培训教程
  • 建设网站公司哪里好建设网站好学吗
  • 昆明城乡建设网站宁波外贸公司联系方式
  • 做电影网站许可证淮北百度seo
  • 电子商务个人网站可以备案吗建筑工程公司企业简介
  • 网站开发 360浏览器爱站网长尾关键词挖掘工具下载
  • 固安建设行政主管部门官方网站页面跳转请记住新域名
  • 网站如何在百度上搜索到青岛商业网站建设
  • 彩票网站我想自己做手机做网站对比路由器做网站
  • 济南网站设计公司wordpress文章加密提示
  • 领优惠卷的网站怎么做电商seo搜索优化