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 portserver.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()

浙公网安备 33010602011771号