Python-day7
2017-04-24 18:05
302 查看
1.类方法classmethod
#!/usr/bin/env python3 # this is CR7 scripts! class test(object): name = "Jay" def __init__(self,name): self.NAME = name @classmethod def talk(cls): print("%s !!"% cls.name) o1 = test("Charlie") o1.talk() ########################################### Jay !!
注:用法很简单,强制的限制调用者调用方法时只能读取类的变量而不能调用构造函数的变量
2.属性方法
#!/usr/bin/env python3 # this is CR7 scripts! class test(object): name = "Jay" def __init__(self,name): self.NAME = name @property def talk(self): print("%s ! !"% self.NAME) o1 = test("charlie") o1.talk ###################################### charlie ! !
注:把一个方法变成静态属性
3.属性方法三部曲
#!/usr/bin/env python3 # this is CR7 scripts! class test(object): name = "Jay" def __init__(self,name): self.NAME = name self.__FOOD = None @property def talk(self): print("%s :"% self.NAME,self.__FOOD) @talk.setter def talk(self,what): self.__FOOD = what @talk.deleter def talk(self): del self.__FOOD print("删完了") o1 = test("charlie") o1.talk = "baozi" o1.talk del o1.talk ################################################# charlie : baozi 删完了
注:作用就是给属性方法传值,然后通过del删除静态属性的值,但是应用场景呢?请看下文:
#!/usr/bin/env python3 # this is CR7 scripts! 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,value): print("%s has change %s"%(self.flight_name,value)) f = Flight("CA980") f.flight_status f.flight_status = 2 ###################################### checking flight CA980 status flight is arrived... CA980 has change 2
注:想知道一个航班当前的状态,是到达了、延迟了、取消了、还是已经飞走了, 想知道这种状态你必须经历以下几步:
连接航空公司API查询
对查询结果进行解析
返回结果给你的用户
因此这个status属性的值是一系列动作后才得到的结果,所以你每次调用时,其实它都要经过一系列的动作才返回你结果,但这些动作过程不需要用户关心, 用户只需要调用这个属性就可以,明白了么?
4.描述信息
#!/usr/bin/env python3 # this is CR7 scripts! class Flight(object): '''这是描述飞机的''' def __init__(self,name): self.flight_name = name print(Flight.__doc__) ################################# 这是描述飞机的
5.其他方法
#!/usr/bin/env python3 # this is CR7 scripts! class Flight(object): def __init__(self,name): self.flight_name = name o1 = Flight("charlie") print(o1.__module__) #################################### __main__
注:来自主函数
6.call方法
#!/usr/bin/env python3 # this is CR7 scripts! class Flight(object): def __init__(self,name): self.flight_name = name def __call__(self, *args, **kwargs): print(*args,**kwargs) Flight("charlie")(1231,123123) ############################################ 1231 123123
注:call方法的调用方式就是类名后面直接+ (),应用场景下文会讲到
7.dict方法
#!/usr/bin/env python3 # this is CR7 scripts! class Flight(object): def __init__(self,name): self.flight_name = name def __call_ dc84 _(self, *args, **kwargs): print(*args,**kwargs) print(Flight.__dict__) o1 = Flight("charlie") print(o1.__dict__) ############################################## {'__module__': '__main__', '__init__': <function Flight.__init__ at 0x000000000284DF28>, '__call__': <function Flight.__call__ at 0x0000000002852048>, '__dict__': <attribute '__dict__' of 'Flight' objects>, '__weakref__': <attribute '__weakref__' of 'Flight' objects>, '__doc__': None} {'flight_name': 'charlie'}
注:列出所有成员和变量
8.str方法
#!/usr/bin/env python3 # this is CR7 scripts! class Flight(object): def __init__(self,name): self.flight_name = name def __str__(self): return self.flight_name o1 = Flight("charlie") print(o1) ################################## charlie
9.__new方法
#!/usr/bin/env python3 # this is CR7 scripts! class test(object): def __init__(self,name,age): self.NAME = name self.AGE = age print("init") def __new__(cls, *args, **kwargs): print("new") return object.__new__(cls) o1 = test("charlie",22) ########################################### new init
注:new方法也会在生成对象的时候执行,而且执行顺序优先于构造函数
10.__new函数解释
#!/usr/bin/env python3 # this is CR7 scripts! class test(object): def __init__(self,name,age): self.NAME = name self.AGE = age print("init") def __new__(cls, *args, **kwargs): print("new") #return object.__new__(cls) o1 = test("charlie",22) ############################################# new
注:说明了类是如何实例化的,所有的类实例化的时候其实是通过new方法去调用init构造函数,从而实现初始化实例的操作!如果以后在定制类的时候需要在实例化对象之前加入一些操作,就可以自定义修改new方法,上文中return object.new(cls)的意思是继承父类中的new方法,进行实例化,和super不同的是·,super是继承了之后要修改,而object是直接继承调用,而此时需要传入参数,需要把test这个类(因为类本身也是个对象)当作参数穿进去,所以cls的作用其实就是self,也就代指test和o1
11.反射1
#!/usr/bin/env python3 # this is CR7 scripts! class dog(object): def __init__(self,name): self.NAME = name def eat(self,food): print("%s is eating %s"%(self.NAME,food)) o1 = dog("bill") funcx = input(">>:") if hasattr(o1,funcx): func = getattr(o1,funcx) func("fish") ####################################################### >>:eat bill is eating fish
注:用户输入的方式传参调用类方法
12.反射2
#!/usr/bin/env python3 # this is CR7 scripts! def bulk(self): print("%s is wang...!!!"%self.NAME) class dog(object): def __init__(self,name): self.NAME = name def eat(self,food): print("%s is eating %s"%(self.NAME,food)) o1 = dog("bill") funcx = input(">>:") if hasattr(o1,funcx): func = getattr(o1,funcx) func("fish") else: setattr(o1,funcx,bulk) o1.bulk(o1) ################################################### >>:bulk bill is wang...!!!
注:把方法加入到类中去调用,但是需要自己把self参数传进去
13.反射3
#!/usr/bin/env python3 # this is CR7 scripts! def bulk(self): print("%s is wang...!!!"%self.NAME) class dog(object): def __init__(self,name): self.NAME = name def eat(self,food): print("%s is eating %s"%(self.NAME,food)) o1 = dog("bill") funcx = input(">>:") if hasattr(o1,funcx): func = getattr(o1,funcx) func("fish") else: setattr(o1,funcx,22) print(getattr(o1,funcx)) #################################################### >>:money 22
注:动态加入一个属性,如果输入的字符在类中找不到对应的属性的话
14.反射4
#!/usr/bin/env python3 # this is CR7 scripts! def bulk(self): print("%s is wang...!!!"%self.NAME) class dog(object): def __init__(self,name): self.NAME = name def eat(self,food): print("%s is eating %s"%(self.NAME,food)) o1 = dog("bill") funcx = input(">>:") if hasattr(o1,funcx): #attr = getattr(o1,funcx) setattr(o1,funcx,"dadadada") else: setattr(o1,funcx,22) print(getattr(o1,funcx)) print(o1.NAME) ###################################################### >>:NAME dadadada
注:如果属性已存在,那么可以修改值
14.反射5
#!/usr/bin/env python3 # this is CR7 scripts! def bulk(self): print("%s is wang...!!!"%self.NAME) class dog(object): def __init__(self,name): self.NAME = name def eat(self,food): print("%s is eating %s"%(self.NAME,food)) o1 = dog("bill") funcx = input(">>:") if hasattr(o1,funcx): delattr(o1,funcx) else: setattr(o1,funcx,22) print(getattr(o1,funcx)) print(o1.NAME) ################################################ >>:NAME Traceback (most recent call last): File "C:/Users/dabin/PycharmProjects/dabin/day7/test.py", line 23, in <module> print(o1.NAME) AttributeError: 'dog' object has no attribute 'NAME'
注:删除变量
15.异常处理
#!/usr/bin/env python3 # this is CR7 scripts! data = [1,2] try: data[3] except IndexError as e: print("without",e) ################################ without list index out of range
注:列表异常处理
16.异常处理2
#!/usr/bin/env python3 # this is CR7 scripts! data = [1,2] try: data[3] open('123.txt') except Exception as e: print("without",e) ######################## without list index out of range
注:一并处理错误,但是只要遇到第一个错,就不会继续往下执行,需要自行判断错误类型
17.异常处理3
#!/usr/bin/env python3 # this is CR7 scripts! data = [1,2] try: data[3] open('123.txt') except IndexError as e: print("index",e) except KeyError as e: print("key",e) except Exception as e: print("except!!") else: print("一切正常") finally: print("不管有没有错,都执行") ############################### index list index out of range 不管有没有错,都执行
注:else指如果没有报错那么执行,finally指不管怎么样都会执行
18.自定义异常处理
#!/usr/bin/env python3 # this is CR7 scripts! class charliefalse(Exception): def __init__(self,msg): self.MSG = msg # def __str__(self): # return "777" try: raise charliefalse('database is disconnected!') except charliefalse as e: print(e) ########################################################## database is disconnected!
注:raise意思是手动触发
网络编程socket
1.server端
#!/usr/bin/env python3 # this is CR7 scripts! import socket #1.声明协议类型 server = socket.socket() #默认不写类型就是IPV4,TCP协议,同时生成socket连接对象 #2.绑定监听端口 server.bind(('localhost',6969)) #3.监听端口(还没开始) server.listen() #等待连接 #server.accept() #不能用server的原因是如果客户端是来自多个地址,那么服务器就不知道到底具体是哪个地址,就好比电话的多个电话打入,无法切换到具体的线路上 #conn是对方打进来的一个链接,一个实例,addr是地址 conn,addr = server.accept() #conn就是客户端连过来而服务器端为其生成的一个连接实例 #接受数据大小 data = conn.recv(1024) print("from client:",data) #返回客户端信息 #发送给客户端的数据 conn.send(b"yesyes") server.close() ################################################# from client: b'Hello,World!'
注:Python3开始所有数据的发送都必须以二进制比特流的方式传送
2.client端
#!/usr/bin/env python3 # this is CR7 scripts! import socket #1.声明协议类型 client = socket.socket() #默认不写类型就是IPV4,TCP协议,同时生成socket链接对象 #2.连接 client.connect(('localhost',6969)) #3.发数据 client.send(b'Hello,World!') #接受服务器的返回,声明数据大小,单位字节 data = client.recv(1024) print("from server:",data) client.close() ######################################## from server: b'yesyes'
3.发送以及接受中文信息
server: #!/usr/bin/env python3 # this is CR7 scripts! import socket #1.声明协议类型 server = socket.socket() #默认不写类型就是IPV4,TCP协议,同时生成socket链接对象 #2.绑定监听端口 server.bind(('localhost',6969)) #3.监听端口(还没开始) server.listen() #等待连接 #server.accept() #不能用server的原因是如果客户端是来自多个地址,那么服务器就不知道到底具体是哪个地址,就好比电话的多个电话打入,无法切换到具体的线路上 #conn是对方打进来的一个链接,一个实例,addr是地址 conn,addr = server.accept() #conn就是客户端连过来而服务器端为期生成的一个连接实例 #接受数据大小 data = conn.recv(1024) print("from client:",data.decode()) #返回客户端信息 #发送给客户端的数据 conn.send(b"yesyes") server.close() client: #!/usr/bin/env python3 # this is CR7 scripts! import socket #1.声明协议类型 client = socket.socket() #默认不写类型就是IPV4,TCP协议,同时生成socket链接对象 #2.连接 client.connect(('localhost',6969)) #3.发数据 client.send('我要开始打电话了!!!'.encode()) #接受服务器的返回,声明数据大小,单位字节 data = client.recv(1024) print("from server:",data) client.close()
注:中文需要加码解码,无法直接b,需要encode以及decode
4.模拟ssh
server: #!/usr/bin/env python3 # this is CR7 scripts! import socket,subprocess #1.声明协议类型 server = socket.socket() #默认不写类型就是IPV4,TCP协议,同时生成socket链接对象 #2.绑定监听端口 server.bind(('localhost',6969)) #3.监听端口(还没开始),如果写了数字那就是最大允许多少个链接 server.listen() #等待连接 #server.accept() #不能用server的原因是如果客户端是来自多个地址,那么服务器就不知道到底具体是哪个地址,就好比电话的多个电话打入,无法切换到具体的线路上 #conn是对方打进来的一个链接,一个实例,addr是地址 while True: conn,addr = server.accept() #conn就是客户端连过来而服务器端为期生成的一个连接实例 #接受数据大小 while True: data = conn.recv(1024) if not data: print("client is lost!") break #print("from client:",data.decode()) #返回客户端信息 result = subprocess.getstatusoutput(data) #发送给客户端的数据 conn.send(result[1].encode()) server.close() client: #!/usr/bin/env python3 # this is CR7 scripts! import socket #1.声明协议类型 client = socket.socket() #默认不写类型就是IPV4,TCP协议,同时生成socket链接对象 #2.连接 client.connect(('localhost',6969)) #3.发数据 while True: msg = input("Please input your information,q[quit]: ").strip() if len(msg) == 0: continue elif msg == "q": break else: client.send(msg.encode()) #接受服务器的返回,声明数据大小,单位字节 data = client.recv(10240000) print(data.decode()) client.close()
相关文章推荐
- python-Day7
- day7 python学习随笔
- Python之路,Day7 - 面向对象编程进阶
- Python学习记录day7
- python学习日志--day7
- python day7(20170228 )
- Python-Day7 面向对象进阶/异常处理/Socket
- Python--day7--面向对象编程进阶
- Python学习记录day7
- python培训Day7 随笔
- PYTHON_DAY7_20160530
- python笔记 - day7-1 之面向对象编程
- python之路,day7-面向对象变成
- python_day7【模块configparser、XML、requests、shutil、系统命令-面向对象】之篇
- python入门笔记(Day7)--slots,@property,MixIn,定制(str,iter,getitem,getattr,call)枚举(Enum)元type,metaclass,ORM
- python学习笔记-Day7
- python2.0 s12 day7
- Python的学习笔记DAY7---关于爬虫(2)之Scrapy初探
- Python廖雪峰实战web开发(Day7-编写MVC)
- Python3教程Web开发实战梳理-day7(编写MVC)