python学习第七天

类的装饰器

静态方法

class Dog(object):

    def __init__(self, name):

        self.name = name

 

    @staticmethod  # 把eat方法变为静态方法

    def eat(self):

        print("%s is eating" % self.name)

 

dog =Dog("caicai")

'''类的静态方法通过类的实例调用,调用时需要单独传递self参数即实例本身'''

dog.eat(dog)

 

类方法

class Dog(object):

    name ="caicai"

    def __init__(self, name):

        self.name = name

 

    @classmethod

    def eat(self):

        print("%s is eating" % self.name)

 

 

d = Dog("ChenRonghua")

'''类的类方法不能访问实例变量,只能访问类变量'''

d.eat()

 

属性方法

class Flight(object):

    def __init__(self,name):

        self.flight_name = name

 

 

    def checking_status(self):

        print("checking flight %s status " % self.flight_name)

        return  1

 

    @property

    def flight_status(self):

        status = self.checking_status()

        if status == 0 :

            print("flight got canceled...")

        elif status == 1 :

            print("flight is arrived...")

        elif status == 2:

            print("flight has departured already...")

        else:

            print("cannot confirm the flight status...,please check later")

 

    @flight_status.setter  # 修改

    def flight_status(self, status):

        status_dic = {

            0: "canceled",

            1: "arrived",

            2: "departured"

        }

        print("\033[31;1mHas changed the flight status to \033[0m", status_dic.get(status))

 

    @flight_status.deleter  # 删除

    def flight_status(self):

        print("status got removed...")

 

 

f = Flight("CA980")

# f.flight_status

# f.flight_status = 2  # 触发@flight_status.setter

del f.flight_status  # 触发@flight_status.deleter

 

f = Flight("CA980")

f.flight_status

 

类的特殊成员方法

__doc__ 输出类的描述信息

class Foo:

    """ 描述类信息,这是用于看片的神奇 """

    def func(self):

        pass

print(Foo.__doc__)

# 输出:类的描述信息

 

__module__ 表示当前操作的对象在那个模块,__class__     表示当前操作的对象的类是什么

import os,sys

import bb

base =os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

sys.path.append(base)

print(sys.path)

obj =bb.m()

'''输出当前对象所在模块'''

print(obj.__module__)

'''输出当前操作的对象的类是什么'''

print(obj.__class__)

 

__call__ 对象后面加括号,触发执行

class m(object):

    def __init__(self):

        self.name ="alex"

    def __call__(self):

        print("ok") 

    def run(self):

        print(self.name)

obj =m()

'''对象名后加括号直接触发执行__call__方法'''

obj()

obj.run()

 

__dict__ 查看类或对象中的所有成员  类调用打印类的所有属性,不包括实例属性。实例调用打印所有实例属性

class C(object):

    name ="alex" 

    def __init__(self,name):

        self.name =name 

    def run(self):

        print("today is good")

obj =C("jack")

'''输出类的属性和方法'''

print(C.__dict__)

'''输出实例变量'''

print(obj.__dict__)

 

__str__ 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值

class C(object):

    def __str__(self):

        '''返回值需为str类型'''

        return "ok"

obj =C()

'''输出__str__方法的返回值'''

print(obj)

 

__getitem__、__setitem__、__delitem__  用于索引操作,如字典。以上分别表示获取、设置、删除数据

 

class Foo(object):

    def __getitem__(self,key):

        print("__getitem__",key) 

    def __setitem__(self, key, value):

        print("__setitem__",key,value) 

    def __delitem__(self, key):

        print("__delitem__",key)

 

obj =Foo()

'''执行__getitem__方法'''

result =obj["k1"]

'''执行__setitem__方法'''

obj["k2"] ="alex"

'''执行__delitem__方法'''

del obj["k2"]

 

反射

class Foo(object):

    def __init__(self):

        self.name = 'wupeiqi'

    def func(self):

        return 'func'

 

obj = Foo()

 

# #### 检查是否含有成员,存在返回True,否则返回False ####

print(hasattr(obj, 'name'))

print(hasattr(obj, 'func'))

 

# # #### 获取成员,属性返回属性值,方法返回内存地址 ####

print(getattr(obj, 'name'))

print(getattr(obj, 'func'))

 

# # #### 设置成员 ####

setattr(obj, 'age', 18)

setattr(obj, 'show', lambda num: num + 1)

print(obj.age)

print(obj.show(1))

 

# # #### 删除成员 ####

delattr(obj, 'name')

delattr(obj, 'func')

print(obj.name)

print(obj.func())

 

异常处理

try:

    code

execpt  错误类型 as e:   错误类型可以写成(错误类型1,错误类型2)

    错误处理

execpt 错误类型 as e:

    错误处理

execpt Execption as e:  抓取所有错误类型

   错误处理

else:

   无错误的处理

finally:

   有没有错误都执行

 

class AlexError(Exception)      自定义异常

      def __init__(self,msg):

             self.message =msg

try:

    raise AlexError("数据库连接不上")

except AlexError as e:

   print(e)

 

raise 触发自定义错误

错误类型

AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
其他错误:http://www.cnblogs.com/wupeiqi/articles/5017742.html


socket
socket地址簇

socket.AF_UNIX unix本机进程间通信 

socket.AF_INET IPV4 

socket.AF_INET6  IPV6

Socket Types

socket.SOCK_STREAM  #for tcp

socket.SOCK_DGRAM   #for udp 

socket.SOCK_RAW     #原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。

socket.SOCK_RDM  #是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。

 

单进程通信

服务端

import socket
server =socket.socket()   确定传输协议,生成socket实例
server.bind(("localhost",6969))  绑定IP和端口
server.listen()   监听绑定端口的连接请求
print("waiting")
conn,addr =server.accept() 等待连接请求
print(conn,addr)
print("coming")
data =conn.recv(1024)  接收消息
print("recv:",data)
conn.send(data.upper()) 发送消息
server.close() 断开连接

 

客户端

import socket
client =socket.socket()
client.connect(("localhost",6969))   发送连接请求
client.send(b"Hello world") 发送消息
data =client.recv(1024)  接收消息
print("recv:",data)
client.close()  断开连接


服务器端实现多连接处理

import socket

 
server = socket.socket() #获得socket实例
 
server.bind(("localhost",9998)) #绑定ip port
server.listen()  #开始监听
 
while True#第一层loop
    print("等待客户端的连接...")
    conn,addr = server.accept() #接受并建立与客户端的连接,程序在此处开始阻塞,只到有客户端连接进来...
    print("新连接:",addr )
    while True:
 
        data = conn.recv(1024)
        if not data:
            print("客户端断开了...")
            break #这里断开就会再次回到第一次外层的loop
        print("收到消息:",data)
        conn.send(data.upper())
 
server.close()

 

 

 

posted @ 2017-03-24 16:49  魅力宁波  阅读(196)  评论(0)    收藏  举报