07_静态方法,socket
staticmethod classmethod property方法
举个静态方法的栗子:
class Dog(object): def __init__(self,name): self.name=name @staticmethod #实际上跟类没什么关系了,只是类下面的一个函数,名义上属于这个类 def eat(self): print("%s is eating %s"%(self.name,"KFC")) d=Dog("Alex") d.eat(d)
Tips:实际场景中使用较少,理解为:相当于类的工具包。
静态方法只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性。
类方法(classmethod):
只能访问类变量,不能访问实例变量
栗子:
@classmethod def eat(self): print("%s is eating %s"%(self.name,"KFC"))
属性方法(property):
把一个方法变成一个静态属性。
class Animal(object): def __init__(self,name): self.name=name self.__food=None @property def eat(self): print("%s is eating %s"%(self.name,self.__food)) @eat.setter def eat(self,food): #传属性 print("Set to eat:",food) self.__food=food @eat.deleter def eat(self): #删除属性 del self.__food print("Have been deleted!!!") a=Animal("Alex") a.eat a.eat="KFC" a.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("CA8910") f.flight_status f.flight_status=2
类的特殊成员方法:
1.__doc__ #描述类的信息 2.__module__ #表示当前操作的对象在哪个模块 __class__ #表示当前操作的对象的类是什么 3.__init__ #构造方法,通过类创建对象时,自动触发执行。 4.__del__ #析构方法,当对象在内存中被释放时,自动触发执行 5.__call__ #对象后面加括号,触发执行 6.__dict__ #查看类或对象中的所有成员 7.__str__ #如果一个类中定义了__str__方法,那么在打印对象时,默认输出该方法的返回值 8.__getitem__,__setitem__,__delitem__ #用于索引操作,如字典,以上分别表示获取,设置,删除数据 9.__new__ \ __metaclass__
反射:
通过字符串映射或修改程序运行时的状态、属性、方法:
等于实现了动态的内存装配
getattr(object,name)
根据字符串去获取obj对象里的对应的方法的内存地址
hasattr(object,name)
判断一个obj对象里是否有对应的name字符串的方法
setattr(x,y,v)
is equivalent to 'x.y=v'
delattr(x,y)
删除方法
举个栗子:
# -*- coding:utf-8 -*- # Author:Zhan Chen def bulk(self): print("%s is yelling..."%self.name) class Dog(object): def __init__(self,name): self.name=name def eat(self,food): print("%s is eating....%s"%(self.name,food)) d=Dog("Alex") choice=input(">>:").strip() if hasattr(d,choice): func = getattr(d,choice) func("kfc") else: # setattr(d,choice,bulk) # d.bulk(d) setattr(d,choice,None)
异常处理
data={} names=['alex','jack'] try: names[3] data['name'] except KeyError as e: print("没有找个key",e) except IndexError as e: print("列表操作错误",e)
抓住所有错误:
data={} names=['alex','jack'] try: names[3] data['name'] except Exception as e: print("天啦噜,出错了",e)
Socket通信
OSI七层模型
TCP/IP(安全的数据发送)
三次握手/四次断开
UDP(不安全的数据发送)
简单的例子
#服务端 import socket #声明类型 server=socket.socket() #绑定需要监听的端口 server.bind(('localhost',6969)) #监听 server.listen() print("等待接入。。。") #等待接入,conn就是客户端连过来而在服务器端为其生成的一个连接实例 conn,addr=server.accept() print("有接入数据。。。") data=conn.recv(1024) print("recv:",data) #返回 conn.send(data.upper()) #关闭 server.close()
#客户端 import socket #声明socket类型,同时生成socket连接对象 client=socket.socket() #连接 client.connect(('localhost',6969)) #发送数据 client.send(b"hello world") #接收返回 data=client.recv(1024) print("recv:",data) #关闭连接 client.close()
人生苦短,我用Python