面向对象类的进阶
抽象类
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)