多态:指的是同一种事物有多种形态。
多态性:指的是不考虑对象属于哪种类型的情况下使用对象。
例:
import abc
class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod
def talk(self):
pass
class Dog(Animal):
def talk(self):
print("汪汪汪")
class Cat(Animal):
def talk(self):
print('喵喵!')
class Pig(Animal):
def talk(self):
print("哼哼哼!")
obj1 = Dog()
obj2 = Cat()
obj3 = Pig()
obj1.talk()
obj2.talk()
obj3.talk()
def talk(animal):
animal.talk()
talk(obj1)
talk(obj2)
talk(obj3)
class Dog:
def talk(self):
print("汪汪汪")
class Cat:
def talk(self):
print('喵喵!')
class Pig:
def talk(self):
print("哼哼哼!")
只要看着像鸭子,长的像鸭子,那就是鸭子类型。
例:
# 代码示范:强制子类使用父类的方法
import abc
class Animal(metaclass=abc.ABCMeta): # 定义抽象基类,Animal已不可单独调用
@abd.abstractmethod # 强制约束所有子类都得有这些功能
def say(self):
print('动物是这样叫的',end='')
class Dog(Animal):
def say(self):
super().say()
print('汪汪汪')
class Cat(Animal):
def say(self):
super().say()
print('喵喵喵')
class Pig(Animal):
def say(self):
super().say()
print('哼哼哼')# 定义了抽象基类,给父类的功能添加装饰器后,就规定了子类定义名字相同的这些功能,如果子类没有,就会报错
反射机制被视为动态语句的核心。在程序运行过程中,动态获取数据的信息。当程序获取对象的时候,程序能够动态获取到对象的属性,方法等等。
先通过print(dir(对象))拿到这个对象所有的内置功能,发现都是字符串格式。再想办法取到字符串属性对应的功能对象.dict[字符串属性]。
hasattr
getattr
setattr
delattr
四个内置方法将在下面统一演示:
class RealEstate:
address='北京'
def __init__(self,name):
self.name=name
def tell_info(self):
print(self.name)
obj1=RealEstate('龙湖地产')
# haveattr(对象/类,属性的字符串格式)----->bool
print(haveattr(obj1,'age'))-----># False
print(haveattr(RealEstate,'address'))-----># True
# getattr(对象/类,属性的字符串格式,default:None)----->找到的话返回属性的值,找不到的话返回default的值
print(getattr(obj1,'name'))-----># '龙湖地产'
print(getattr(obj1,'address','抱歉,该属性不存在'))-----># '抱歉,该属性不存在'
res=getattr(RealEstate,''tell_info)
res(obj1)-----># '龙湖地产'
# setattr(对象/类,属性,属性的新值)----->属性存在的话则重新赋值,不存在的话则创建属性
setattr(obj1,'money','一个亿')
print(obj1.money)
setter(obj1,'name','啊哈地产')
print(obj1.name)-----># '啊哈地产'
# delattr(对象/类,属性)----->属性存在则删除属性,属性不存在报错
delattr(obj1,'namenamename')-----># 报错
delattr(obj1,'address')-----># 删除address属性
例:
class FtpServer:
def put(self):
print('正在执行上传功能')
def get(self):
print('正在执行从下载功能')
def interactive(self):
module=input('>>>:').strip()
if hasattr(self,method):
getattr(self,method)()
else:
print('输入的指令不存在')
obj=FtpServer()
obj,interactive()
1:什么是内置方法?
定义在类内部,以__开头并以__结尾的方法
特点:会在某种情况下自动触发执行
2:为什么用内置方法?
为了定制化我们的类or对象
3:怎么用内置方法?
3.1 str,repr,format
str__方法会在打印的时候自动触发,只能返回一个字符串。同样效果的还有__repr(self),format(self,format_spec)
例:
class People:
def __init__(self,name,age):
self.name=name
self.age=age
def __str__(self):
return '{}:{}'.format(self.name,self.age)
obj1=People('wth',20)
print(obj1)-----># 'wth:20'
当__str__,repr__同时存在的时候,会按照__str__规定的格式进行打印。
3.2 del
析构方法,当对象在内存中被释放时(清理内存时被清理掉),自动触发执行。如果产生的对象仅仅只是python程序级别的,那么无需定义__del,如果产生对象的同时还会向操作系统发起资源调用,即一个对象有用户级与内核级两种资源,比如(这个对象的一个属性链接到了文件对象或者数据库),则必须在清楚对象的同时回收操作系统资源,这就用到了__del__。如果我们在文件的进程中没有释放内存中的对象的名称空间,程序文件运行完后其占用的资源也会被内存回收。
class Teacher:
def __init__(self,name,age):
self.name=name
self.age=age
self.f=open('a.txt','wb')
def __str__(self):
return '{}---{}'.format(self.name,self,age)
def __del__(self):
self.f.close()
print('over')
# 情况一:
obj1=Teacher('wth',20)
print('结束啦')
# 如果在所有代码运行结束后没有删除对象,__del__会自动执行
# 程序运行结果:
'结束啦'
'over'
# 情况二:
obj1=Teacher('wth',20)
del obj1
print('结束啦')
# 如果先调用删除对象,则在程序结束后,不需要回收对象占用的内存空间
# 程序运行结果:
'over'
'结束啦'
3.3 其他内置方法
link
什么是原类?
例:
class People:
def __init__(self,name,age)
self.name=name
self.age=age
def say(self):
print('{}-{}'.format(self.name,self.age))
# 如何得到对象:
obj=调用类()
obj=People('wth',20)
# 如何得到类
2:为什么要有原类?
3:怎么用原类?
1:什么是异常?
异常是错误发生的信号,程序一旦出错就会产生一个异常,如果该异常没有被处理,该异常就会抛出来,程序的运行也随即终止。
错误分为两种:
· 语法错误
· 逻辑错误
2:如何处理异常?
监测异常的具体语法:
try:
被检测代码块
except 异常类型1:
针对异常类型1的解决方法
except 异常类型2:
针对异常类型2的解决方案
except Exception: # 如果不论什么异常解决方案都固定,则可以只保留这部分
针对其他异常类型的解决方案
else: # 不能只有try和else,语法错误
当被监测代码块没有出现异常执行的代码
finally:
无论被监测代码有没有出现异常都会执行的操作,一般是回收系统资源的操作
例:
list1=[1,2,3,4,5]
index=input('请输入您想取元素的位置:').strip()
try:
res=list1[int(index)]
print(res)
except IndexError:
print('抱歉,您输入想索引元素的位置超出了列表的长度')
except ValueError:
print('抱歉,请输入数字!')
抛出异常的例子:
l=[11,22]
if len(l)==3:
print(123)
else:
raise Exception('抱歉列表中元素不足三个')
1:断言 (测试程序的时候使用)
l=[11,22]
assert len(l)==3 # 如果声明的内容成立,assert语句当作不存在。但如果assert的内容不满足,会抛出AssertionError
2:抛出异常
raise 异常的的类型或者自定义异常的类型
3:自定义异常(通过BaseException)
class Permission(BaseException):
def __str__(self):
return '抱歉,您没有获得许可批准!'
raise Permission