抽象,更加抽象和异常
1介绍
本节将记录一些类和异常的知识点。
抽象指的是方法,和方法有关的也就是参数,重载,作用域等等。
更加抽象指的是类,牵涉到多态,封装,继承。
异常指的就是异常。
面向对象编程的思想在很多种高级语言中都存在,可能在某些细节上有所不同,但是整体上都是一致的。
2抽象
2.1创建函数
Def 函数名(参数):
很简单,不过需要注意的一点是当将可变的数据结构(如,列表)作参数时,与普通变量作参数是不一样的。如下图:
等同于
是否与其他语言不太一样呢?是否违反了方法内语句块的作用域呢?这就像是参数接受的是指针一样,而不是形参的备份,这样很方便。如果想不修改传入可变的数据结构的值,那就传入其拷贝的版本,如,name0[]=name[:]。
如果传入的参数不是可变的数据结构,那么就要使用return来返回值了。
2.2收集参数
当某个方法需要多个参数,使用时,不仅要控制参数传入的个数,还要控制参数传入的顺序。
更加灵活,收集参数:
(1)*参数名:’*’的意思是收集其余的位置参数,并将其全部放在元组里。
(2)**参数名:’**’的意思是收集其余的位置参数,并将其全部放在字典里。
3更加抽象
3.1多态
对不同类的对象使用同一种操作,简而言之,不同的类型可以使用同一个方法,得到想要的结果。比如:count方法
3.2封装
封装是指向程序中的其他部分隐藏对象的具体实现细节的原则,它与抽象的概念类似。
没错,听起来就跟没说一样。简单点说,就是类内部的私有化,比如类内定义的某个方法,只能在类内访问,而不能在类外访问。
事实上,python并不支持私有化,从理论上来说,类内不到属性和方法,通过该类,在类外均能访问。但是,可以使用一些小技巧来达到私有特性的效果。
def __方法名(参数):
在方法名前使用双下划线。这样类外就无法访问了。事实上,这个小技巧并非真正的私有化,可以仍然通过实例名._类名__方法名()来访问。
3.3继承
指定超类,也就是基类,也就是父类。
Class 类名(基类名):
如果,存在多个基类如Class name(a,b),那么a,b类有相同的方法,a中的方法覆盖b中的方法,而不同的方法则同时存在。
#!/usr/bin/python3
#类定义
class people:
#定义基本属性
name = ''
age = 0
#定义私有属性,私有属性在类外部无法直接进行访问
__weight = 0
#定义构造方法
def __init__(self,n,a,w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print("%s 说: 我 %d 岁。" %(self.name,self.age))
#单继承示例
class student(people):
grade = ''
def __init__(self,n,a,w,g):
#调用父类的构函
people.__init__(self,n,a,w)
self.grade = g
#覆写父类的方法
def speak(self):
print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
#另一个类,多重继承之前的准备
class speaker():
topic = ''
name = ''
def __init__(self,n,t):
self.name = n
self.topic = t
def speak(self):
print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic))
#多重继承
class sample(speaker,student):
a =''
def __init__(self,n,a,w,g,t):
student.__init__(self,n,a,w,g)
speaker.__init__(self,n,t)
test = sample("AC",25,80,4,"Python")
test.speak() #方法名同,默认调用的是在括号中排前地父类的方法
4异常
结构:
Try:
语句块
Except:
捕捉异常后执行
Else:
没有异常执行
源码:
#!/usr/bin/python3
while True:
try:
x=int(input('x='))
y=int(input('y='))
vlaue=x/y
print('x/y=',vlaue)
except:
print ('Invalid input.Please try again!')
else:
break