多态
python的多态与java的多态类似。比如一种常见的使用形式就是在函数传参的时候传递的可以是父类和继承该父类的多种子类。然而python比java更灵活
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| 定义: 多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承) 例如: 序列有多种形态:字符串,列表,元祖 动物有多种形态:人,猪,狗 多态和多态性的区别: 多态:同一种事物的多种形态,动物分为人类,猪类(在定义角度) 多态性:一种调用方式,不同的执行效果(多态性) """ 面向对象的三大特征:封装,继承,多态
封装:又称为信息的隐藏,类的实现和使用时分开的,类提供了外部访问的方法,调用者不需要关注 类里面的具体实现,会调用即可
生活中封装:买手机会用就可以
继承:一个类继承另外一个类,被继承的类称为父类或者基类,继承的类称为子类或者派生类, 子类可以共享父类里面受保护,公有属性和方法,子类不能共享父类私有属性和方法 继承可以减少代码的书写,提高代码的可维护性
多态:同一种事物有多种形态 多态性:同一种调用方式,返回不同的结果 多态的前提:继承和重写 """
class Animal(object): def sayHello(self): pass
class Person(Animal): def sayHello(self): print('hello,i am Person')
class Pig(Animal): def sayHello(self): print('aoao,i am Pig')
class Dog(Animal): def sayHello(self): print('wangwang,i am Dog')
Per = Person() Pi = Pig() Do = Dog()
def func(o): o.sayHello()
func(Per) func(Pi) func(Do)
class Cat(Animal): def sayHello(self): print('mimi,i am Cat')
ca = Cat() func(ca)
""" 多态的好处: 1.提高代码在外部调用灵活性 2.提高代码的扩展性 """
|
类属性和实例属性
类属性
定义:在类中定义的属性
举个例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 概述: 在类中定义的属性(公有和私有)
class Person(object): name = 'xiaoming' __age = 12
p = Person() print(p.name) print(Person.name)
print(p.__age) print(Person.__age)
|
实例属性
定义:定义在init初始化方法中的属性
举个例子,什么是实例属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
class Person(object): address = '上海市'
def __init__(self,name,age): self.name = name self.age = age
pe = Person('张三',30)
print(Person.address) print(Person.name) print(Person.age)
|
实例属性和类属性的关系:同名的情况下,实例属性会覆盖类属性
举个例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Person(object): country = 'china'
def __init__(self): self.country = '上海市'
p = Person() print(p.country) print(Person.country)
p.country = 'chinese' print(p.country) print(Person.country)
del p.country print() print(p.country) print(Person.country)
|
静态方法和类方法
类方法
定义
概述: 类对象所拥有的方法,需要使用到修饰器 @classmethod---->类方法
对于类方法,第一个参数必须是类对象,一般以cls表示作为第一个参数(当然可以用其他的名字,但是不建议修改)
举个例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
class Person(object): country = 'china'
@classmethod def getCountry(cls): return cls.country
@classmethod def setCountry(cls, country): cls.country = country
p = Person() print(p.getCountry()) print(Person.getCountry())
p.setCountry('chinese') print(p.getCountry()) print(Person.getCountry())
|
静态方法
定义:通过修饰器@staticmethod来进行修饰,不需要传参数
举个例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 概述: 需要通过修饰器@staticmethod来进行修饰,不需要传参数
class Person(object): country = 'china'
@staticmethod def getCountry(): return Person.country
p = Person() print(p.getCountry())
|
总结
类方法:声明方法之前,需要使用到修饰器 @classmethod,里面第一个参数类对象cls,类对象访问的是类属性或者类方法
实例方法:隐含传递的参数是self,对象本身,self访问的可能是实例属性,也有可能是类属性,类方法,静态方法
静态方法:声明方法之前,需要使用到修饰器@staticmethod,不需要加任何参数,访问的是类属性的引用,只能通过类对象调用
__slots__
定义:限制实例属性
语法格式:slots = ('属性1','属性2')
__slots__属性限制添加属性只对当前类的实例对象起作用,对类属性,继承的子类实例对象不起作用的
举个例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| 动态语言:可以在运行的过程中,修改代码 静态语言:编译时已经确定的代码,运行的时候不能修改
如果我们想要限制实例属性? 允许对Person实例中添加name和age属性, python允许定义class的时候,定义一个特殊的变量---->__slots__,限制class能够添加的属性 语法格式:__slots__ = ('属性1','属性2')
class Student(object): __slots__ = ('name','sex')
stu = Student()
stu.name = '张三' stu.sex = '男' print(stu.name) print(stu.sex)
Student.weight = '50kg' print(stu.weight)
class Demo(Student): pass d = Demo() d.height = '180' print(d.height)
""" 注意:__slots__属性限制添加属性只对当前类的实例对象起作用,对类属性,继承的子类实例对象不起作用的 """
|
@property
私有属性添加getter和setter方法
python中和java类似的是私有属性不能直接修改,需要调用专门的方法才能修改;但python相对于java做出了优化,通过property函数创建一个特性(property),将
getMoney
方法作为获取属性值的方法,setMoney
方法作为设置属性值的方法。这样就可以像访问普通属性一样来访问
Money
类中的 money
属性
举个例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
class Money(object): def __init__(self): self.__money = 0
def setMoney(self,value): if isinstance(value,int) or isinstance(value,float): self.__money = value else: print('Error:金额只能是整形或者浮点型')
def getMoney(self): return self.__money
money = property(getMoney,setMoney)
mo = Money()
mo.setMoney(100) print(mo.getMoney())
mo.money = 500 print(mo.money)
|
使用property取代getter和setter方法
取代set/get------》修饰器-----》@property @property--->属性函数,可以对属性赋值时候做必要的检查,并保证代码的清晰简短
作用: 1.将方法转化为只读
2.重新实现一个属性的设置和读取方法,可做边界判定
举个例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Money(object): def __init__(self): self.__money = 0
@property def money(self): return self.__money
@money.setter def money(self,value): if isinstance(value,int) or isinstance(value,float): self.__money = value else: print('Error:不是整形也不是浮点型')
m = Money() print(m.money) m.money = 16888 print(m.money)
|
发送邮件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| import smtplib
from email.mime.text import MIMEText
SMTPServer = 'smtp.163.com'
sender = 'ztb0016@163.com'
password = 'GTTULMLHIKOZSXIZ'
message = '你是一个好人123333...'
msg = MIMEText(message)
msg['subject'] = '来自一位帅哥的表白33333'
msg['from'] = sender
emailServer = smtplib.SMTP(SMTPServer,25)
emailServer.login(sender,password)
emailServer.sendmail(sender,['piolet0016@gmail.com'],msg.as_string())
emailServer.quit()
|
用列表模拟栈
append模拟入栈
pop模拟出栈
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| """ 栈--->有名堆栈 原理:先进后出
装子弹 """
import os def getAllFileDir(path): stack = [] stack.append(path) while len(stack) != 0: outDir = stack.pop() filelist = os.listdir(outDir) for fileName in filelist: fileAbsPath = os.path.join(outDir,fileName) if os.path.isdir(fileAbsPath): print('目录:',fileName) stack.append(fileAbsPath) else: print('文本文件:',fileName)
getAllFileDir('C:\python课程大纲\python课程大纲')
|
专门模拟队列的
定义一个队列
1 2
| import collections queue = collections.deque()
|
入队
出队
1
| outDir = queus.popLeft()
|
具体事例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| """ 队列原理:先进先出 #银行办理业务排队
collections deque() 创建一个队列 append() 队列添加元素 popLeft() 从队列里面删除元素 len() 获取长度
listdir()获取当前目录下所有的文件 isdir()判断是否是目录 """ import collections import os def getAllFileDir(path): queue = collections.deque() queue.append(path) while len(queue) != 0: outDir = queue.popleft() filelist = os.listdir(outDir) for fileName in filelist: fileAbsPath = os.path.join(outDir,fileName) if os.path.isdir(fileAbsPath): print('目录:',fileName) queue.append(fileAbsPath) else: print('文本文件:',fileName)
getAllFileDir('C:\python课程大纲\python课程大纲')
|
高阶函数
map
定义:根据提供的函数对指定的序列做映射
格式
map(function,iterable)
function---》函数,两个参数---》返回值是一个新的列表
iterable---》一个或者多个序列
python2:返回列表 python3:返回的是迭代器
举例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| li = [1,2,3,4]
def square(n): return n ** 2
res = map(square,li) print(res) print(tuple(res)) print(list(res))
li2 = ['1','2','3','4']
def chrToInt(str): return {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5}[str] res2 = map(chrToInt,li2)
res3 = map(str,[1,2,3,4]) print(tuple(res3))
|
reduce
定义:reduce()函数会对参数中的元素进行累积
函数将一个数据集合(列表,元组)中的所有数据进行下列操作:用传给 reduce
中的函数 function(有两个参数)先对集合中的第 1、2
个元素进行操作,得到的结果再与第三个数据用 function
函数运算,最后得到一个结果。
格式:
reduce(function,iterable,[initializer]) function:函数,有两个参数
iterable:可迭代的对象 initializer:可选,初始化参数
举例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| from functools import reduce
def add(a,b): return a + b res = reduce(add,range(1,101)) print(res)
str = 'hello python hello php python aa ss aa' list = str.split(' ') print(list)
def func(x,y): if y in x: x[y] += 1 else: x[y] = 1 return x res3 = reduce(func,list,{})
print(res3)
|
filter
定义
filter()函数:用于过滤序列,过滤掉不符合条件的元素,返回由符合条件的元素组成的新列表
格式
filter(function,iterable) function:函数 判断函数
iterable:序列,序列的每一个元素作为参数传递到函数进行判断,返回True,False,最后将返回True的元素存放到一个新的列表中
返回值
Pyhton2返回列表 Python3返回迭代器对象
举个例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| list01 = [1,2,3,4,5,6,7,8,9,10]
def even(num): if num % 2 == 0: return True return False res = filter(even,list01) print(list(res))
list02 = [['姓名','年龄','爱好'],['xiaoming',25,'无'],['laowang',30,'写代码'],['xiaogang',29,'无']]
def test(v): if v == '无': return False return True for line in list02: res2 = filter(test,line) print(list(res2))
res4 = filter(lambda x:x.isdigit(),L) print(list(res4))
|
sorted
定义
sorted()函数对所有的可迭代的对象进行排序的操作 sort:
方法返回的是对已经存在的列表进行操作
sorted:返回值为一个新的list,而不是在原来的基础上进行的操作。
格式
sorted(iterable[, cmp[, key[, reverse]]]) iterable:可迭代的对象 cmp
---》比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
key
---》主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse ---》 排序规则,reverse = True 降序 , reverse = False
升序(默认)。
举个例子
1 2 3 4 5 6 7 8 9 10 11 12
| lst = [2,0,99,20,100,111] lst.sort() print(lst) res = sorted(lst) print(res)
lst2 = [-3,10,8,2,111,-200] lst2.sort() print(lst2) res2 = sorted(lst2,key=abs) print(res2)
|