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)
posted @ 2016-12-08 16:51  白日梦想家Zz  阅读(363)  评论(0编辑  收藏  举报