Python运维开发之路《函数进阶》
面向对象类的进阶
抽象类
python 没有抽象类、接口的概念,所以要实现这种功能需要导入abc模块
py2:导入abc函数,_metaclass__ = abc.ABCMeta;在强制调用类下:@abc.abstractmethod
import abc class Alert(object): '''报警基类''' __metaclass__ = abc.ABCMeta @abc.abstractmethod def send(self): '''报警消息发送接口''' pass class MailAlert(Alert): pass m = MailAlert() m.send()
py3:再强制调用类下添加raise NotImplementedError
import abc class Alert(object): '''报警基类''' __metaclass__ = abc.ABCMeta def send(self): #强制调用send,不调用报错:NotImplementedError '''报警消息发送接口''' raise NotImplementedError class MailAlert(Alert): #pass def send(self,msg): print('>>>>>sending:',msg) m = MailAlert() m.send('OK')
静态方法
通过@staticmethod 避免实例化开辟大量内存空间 既不能访问公有属性,也不能访问实例属性
类方法:
@classmethod 类方法,只能访问类的公有属性,不能访问实例属性
属性方法:
@property 作用是把一个方法变为一个静态属性
@property + 修改属性方法@talk.setter 删除@talk.delter
class Person(object): '''''' name = 'LAIN' def __init__(self,name): self.Name = name @staticmethod #不能访问公有属性和实例属性 def eat(name,food): print('%s is eating %s'%(name,food)) @classmethod #只能访问公有属性,不能实例属性 def walk(self): print('%s is walking'%self.name) @property def talk(self): print('%s says' %self.name) p = Person('LAIN') p.eat('LAIN','kfc') p.walk() p.talk
类的特殊方法
print(Foo.__doc__) 查看类的描述信息 __import__('time.account',fromlist=True) 动态导入, 以字符串模式导入模块 __call__():实例+()会触发call method __dict__ 打印实例中所有属性值 __getitem__ 以字典的形式操作实例 __new__ 先于__init__执行,可以在new中自定义类的实例化过程 __str__ 返回实例的字符串形式 __metaclass__ 元类 动态创建类 type() 可以动态创建一个类 =============================================== 异常处理 一、基本异常处理结构 try: 代码块 except Exception as e: 代码块 二、复杂异常处理结构 try: 代码块 except: 代码块 else: 代码块 finally: 代码块 错误:try>except>finally 正确:try>else>finally 三、异常对象 try: 代码块 except Exception as obj: python内部将错误信息封装到obj中 代码块 四、异常种类 exception 能捕获所有异常信息(万能) try: 代码块 except Exception as obj: 代码块 execpt ValueError as obj: 代码块 execpt I/O as obj: 代码块 execpt IndexError as obj: 代码块 execpt (IndexError,IndexError) as obj: print(obj) IndentationError,Syn... 无法抓到 五、主动触发异常 主动触发异常:raise Exception('邮件发送失败') 六、断言 assert 条件 #条件为true断言不执行,为false抛出异常 七、自定义异常 class HaiTaoError(Exception): ======================================================== 反射 getattr('容器','名称') 以字符串的形式去某个对象中,获取指定的属性 hasattr('容器','名称') 以字符串的形式判断某个对象中,是否含有指定的属性 setattr('容器','名称','值') 以字符串的形式去某个对象中,设置或添加指定属性 delattr('容器','名称') 以字符串的形式去某个对象中,删除指定属性 ========================================================= socket socket.SOCK_STREAM #for tcp socket.SOCK_DGRAM #for udp socket.SOCK_RAM #原始套接字 socket.SOCK_RDM #一种可靠的UDP形式 socket.SOCK_SEQACKET #废弃 ========================= server端 server = socket.socket(AF_INET,SOCK_STREAM) server.bind(('0.0.0.0',8000)) server.listen(5) conn,client_addr = server.accept() #conn,客户端过来的连接生成的对象 conn.send('') conn.recv('') server.close() client端 client = socket.socket(AF_INET,SOCK_STREAM) client.connect() ==================================== for line in f: conn.send(line) f.write(d)
本文来自博客园,作者:白日梦想家Zz,转载请注明原文链接:https://www.cnblogs.com/zzlain/p/6130596.html