day7—直播内容(元昊老师著)
*******************************
class animal(object):
def __init__(self):
self.is_handsome=True def eat(self):
if self.is_handsome:
print "eat...."
else:
print "no handsome" class dog(animal):
def __init__(self):
#animal.__init__(self)
super(dog,self).__init__()
self.hair="black" def bite(self):
print "bite me!" d=dog()
d.bite()
d.eat() ****************************************** 我有一个字典,从某个地方获取的,比如http请求发过来的,我要根据这个
字典来构建一个对象。 class Person:
def __init__(self,_obj):
self.name = _obj['name']
self.age = _obj['age']
self.energy = _obj['energy']
self.gender = _obj['gender']
self.email = _obj['email']
self.phone = _obj['phone']
self.country = _obj['country'] class Person:
def __init__(self,_obj):
self.__dict__.update(_obj) 在Python中,所有的东西都是对象,这些对象是由一个类型实例化而来;那么说,
这些对象就有属性和方法,属性可以存储一些值。而从直观上来看,任何可以存储
东西的事物,我们都可以说它有一个空间(只有有空间,才能存储东西嘛),而在
编程中,我们一般使用术语“名字空间”或“命名空间”(namespace)来称呼它。这样,
我们就得出,每个对象都有一个名字空间。而在Python中,我们使用对象的__dict__
属性来保存该对象的名字空间中的东西,__dict__是一个字典(“键-值”对,一般“键”
就是属性名或方法名,“值”就是属性的值或方法名所指向的真正的方法实体对象)。 #__dict__:实例属性
class Animal:
price = 10
__a = 22
def __init__(self):
self.__color = "red"
self.__price = 11 class Dog(Animal):
__b = 10
c = 33 if __name__ == "__main__":
dog=Dog()
print (dog.__dict__) *******************************************
在Python中,重载__getattr__、__setattr__、__delattr__和__getattribute__
方法可以用来管理一个自定义类中的属性访问。其中,__getattr__方法将拦截所
有未定义的属性获取(即,当要访问的属性已经定义时,该方法不会被调用,至于
定义不定义,是由Python能否查找到该属性来决定的);__getattribute__方法将
拦截所有属性的获取(不管该属性是否已经定义,只要获取它的值,该方法都会调
用),由于此情况,所以,当一个类中同时重载了__getattr__和__getattribute__
方法,那么__getattr__永远不会被调用,另外,__getattribute__方法仅仅存在于
Python2.6的新式类和Python3的所有类中;__setattr__方法将拦截所有的属性赋
值;__delattr__方法将拦截所有的属性删除。说明:在Python中,一个类或类实
例中的属性是动态的(因为Python是动态的),也就是说,你可以往一个类或类实
例中添加或删除一个属性。 1.1 重载__setattr__方法:
在重载__setattr__方法时,不能使用“self.name = value”格式,否则,它将会导致
递归调用而陷入死循环。正确的应该是: def __setattr__(self, name, value):
# do-something
object.__setattr__(self, name, value)
# do-something 注:其中的“object.__setattr__(self, name, value)”一句可以换成
“self.__dict__[name] = value”; 1.2 重载__delattr__方法:
在重载__delattr__方法时,不能使用del self.name格式,否则,它将会导致递归
调用而陷入死循环。正确的应该是: def __delattr__(self, name):
# do-something
object.__delattr__(self, name)
# do-something 注:其中的“object.__delattr__(self, name)”一句可以换成
“del self.__dict__[name]”; 1.3 重载__getattribute__方法: def __getattribute__(self, name):
# do-something
return object.__getattribute__(self, name)
# do-something
在__getattribute__方法中不能把“return object.__getattribute__(self, name)
”一句替换成“return self.__dict__[name]”来避免循环,因为它
(即其中的self.__dict__)也会触发属性获取,进而还是会导致递归调用。 1.4 重载__getattr__方法:
由于__getattr__方法是拦截未定义的属性,所以它没有其他三个操作符方法中那么
多的限制,因此,你可以像正常的代码一样编写它。它的作用就是,当一段代码
(用户写的,可能是故意,也可以是无意)获取了类或类实例中没有定义的属性时,
程序将做出怎样的反应,而这个回应就在__getattr__方法中,由你来定。 ************************************************************ class computer(object):
def __init__(self):
self.brand=""
self.color="" def set_pro(self,pro):
self.brand,self.color=pro
def get_pro(self):
return self.brand,self.color c=computer()
print c.get_pro()
print c.set_pro(("gaier","red"))
print c.get_pro() 如果我们的属性很多,这种写法就不合适了,我们可以通过拦截属性解决,即将所
有的获取,赋值操作写在一个拦截属性函数里 class computer2(object):
def __init__(self):
self.brand="1"
self.color=""
def __setattr__(self, key, value):
if key=="pro":
self.brand,self.color=value
else:
self.__dict__[key]=value def __getattr__(self, item):
if item=="pro":
return self.brand,self.color
else:
raise AttributeError
#print "errors..." c2=computer2()
# c2.pro=("sanxing","blue")
#
# print c2.pro
# c2.a=4
# print c2.a
# print c2.acd
#print c2.brand c2.money=12
print c2.money
print c2.abc
print c2.__dict__ *******************************************************
2.7编码问题: python 有str object 和 unicode object 两种字符串, 都可以存放字符的字节编
码,但是他们是不同的type,这一点很重要,也是为什么会有encode 和decode。 encode 和 decode在pyhton 中的意义可表示为 encode
unicode -------------------------> str(gb2312 or utf-8)
unicode <--------------------------str(gb2312 or utf-8)
decode
几种常用法:
str_string.decode('codec') 是把str_string转换为unicode_string, codec是源str_string的编码方式
unicode_string.encode('codec') 是把unicode_string 转换为str_string,codec是目标str_string的编码方式
str_string.decode('from_codec').encode('to_codec') 可实现不同编码的str_string之间的转换
比如:
>>> t='长城'
>>> t
'\xb3\xa4\xb3\xc7'
>>> t.decode('gb2312').encode('utf-8')
'\xe9\x95\xbf\xe5\x9f\x8e'
str_string.encode('codec') 是先调用系统的缺省codec去把str_string转换为
unicode_string,然后用encode的参数codec去转换为最终的str_string. 相当于
str_string.decode('sys_codec').encode('codec')。 *********************************************************
socket(family,type[,protocal]) 使用给定的地址族、套接字类型、协议编号
(默认为0)来创建套接字。 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 服务端socket函数
s.bind(address):将套接字绑定到地址, 在AF_INET下,以元组(host,port)的形式
表示地址.
s.listen(backlog):开始监听TCP传入连接。backlog指定在拒绝连接之前,操作系统
可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。 s.accept():接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可
以用来接收和发送数据。address是连接客户端的地址。 客户端socket函数
s.connect(address):连接到address处的套接字。一般address的格式为元组
(hostname,port),如果连接出错,返回socket.error错误。 s.recv(bufsize[,flag]):接受TCP套接字的数据。数据以字符串形式返回,
bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。
s.send(string[,flag]):发送TCP数据。将string中的数据发送到连接的套接字。
返回值是要发送的字节数量,该数量可能小于string的字节大小。
s.sendall(string[,flag]):完整发送TCP数据。将string中的数据发送到连接的套接
字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。 s.close()
关闭套接字。
s.getpeername()
返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。
s.getsockname()
返回套接字自己的地址。通常是一个元组(ipaddr,port)
*********************************************************
eg1:
#!/usr/bin/env python
# -*- coding:utf-8 -*- import socket ip_port = ('127.0.0.1',9997) sk = socket.socket()
sk.bind(ip_port)
sk.listen(5) while True:
print 'server waiting...'
conn,addr = sk.accept() client_data = conn.recv(1024)
print client_data
conn.sendall('滚蛋!') conn.close()
----------------
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
ip_port = ('127.0.0.1',9997) sk = socket.socket()
sk.connect(ip_port) sk.sendall('我喜欢你') server_reply = sk.recv(1024)
print server_reply print sk.getpeername()
print "*****"
print sk.getsockname() sk.close() ***********************************************
eg2:
#!/usr/bin/env python
#coding:utf-8
import socket def handle_request(client):
buf = client.recv(1024)
client.send("HTTP/1.1 201 OKkkkkk\r\n\r\n")
client.send("Hello, World") def main():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost',8082))
sock.listen(5) while True:
connection, address = sock.accept()
handle_request(connection)
connection.close() if __name__ == '__main__':
main() ***********************************************
eg3(talking): #!/usr/bin/env python
# -*- coding:utf-8 -*- import socket ip_port = ('127.0.0.1',8884)
sk = socket.socket()
sk.connect(ip_port)
print "客户端启动:"
while True:
inp = raw_input('>>>')
sk.sendall(inp)
server_response=sk.recv(1024)
print server_response
if inp == 'exit':
break
sk.close()
-----------------------
#!/usr/bin/env python
# -*- coding:utf-8 -*- import socket ip_port = ('127.0.0.1',8884)
sk = socket.socket()
sk.bind(ip_port)
sk.listen(5)
print "服务端启动..."
while True:
conn,address = sk.accept()
while True:
try:
client_data=conn.recv(1024)
except Exception:
break
print client_data
print "waiting..."
#server_response=raw_input(">>>")
#conn.sendall(server_response)
conn.sendall(client_data) conn.close() 注意:
当我们断开第一个客户端时,此时server端 client_data=conn.recv(1024)
这里便会接收一个空字符串,从而造成死循环,而windows系统会将这种情况视为
一个错误,UNIX/linux则不会!所以在linux下,只需判断下client_data为空时break
即可解决! 这个问题与3.0/2.0没有关系 *****************************************************
为了解决并发问题,我们采用socketserver模块 #!/usr/bin/env python
# -*- coding:utf-8 -*-
import SocketServer class MyServer(SocketServer.BaseRequestHandler): def handle(self):
print "服务端启动..."
while True:
conn = self.request
print self.client_address
while True:
try:
client_data=conn.recv(1024)
except Exception:
break
print client_data
print "waiting..."
#server_response=raw_input(">>>")
#conn.sendall(server_response)
conn.sendall(client_data) conn.close()
# print self.request,self.client_address,self.server if __name__ == '__main__':
server = SocketServer.ThreadingTCPServer(('127.0.0.1',8090),MyServer)
server.serve_forever()
---------------------------------------------------- #!/usr/bin/env python
# -*- coding:utf-8 -*- import socket ip_port = ('127.0.0.1',8090)
sk = socket.socket()
sk.connect(ip_port)
print "客户端启动:"
while True:
inp = raw_input('>>>')
sk.sendall(inp)
server_response=sk.recv(1024)
print server_response
if inp == 'exit':
break
sk.close() *****************************************************
ssh: #!/usr/bin/env python
# -*- coding:utf-8 -*-
import SocketServer
import subprocess class MyServer(SocketServer.BaseRequestHandler): def handle(self):
print "got connection from",self.client_address
while True: conn=self.request
data=conn.recv(1024)
print "Recv cmd:%s"%data
cmd_call=subprocess.Popen(data,shell=True,stdout=subprocess.PIPE) cmd_result=cmd_call.stdout.read()
if len(cmd_result)==0:
cmd_result=b"no output!"
conn.send(str(len(cmd_result)))
#conn.recv(1024)
conn.sendall(cmd_result)# 超过1024的部分放到缓存区,并不阻塞在这里 if __name__ == '__main__':
server = SocketServer.ThreadingTCPServer(('127.0.0.1',8091),MyServer)
server.serve_forever() #dir arp cd ipconfig -------------------------------
#!/usr/bin/env python
# -*- coding:utf-8 -*- import socket ip_port = ('127.0.0.1',8091)
sk = socket.socket()
sk.connect(ip_port)
print "客户端启动:"
while True:
inp = raw_input('>>>')
if len(inp)==0:
continue
if inp=="q":
break
sk.sendall(inp)
res_size=sk.recv(1024)
#sk.send("ok")
print "res_size",res_size
total_size=int(res_size)
received_size=0
while True: server_response=sk.recv(1024)
received_size+=len(server_response)
if total_size==received_size: print server_response
break print server_response sk.close() ***********************************************************
day7—直播内容(元昊老师著)的更多相关文章
- day7_直播_网络编程篇(元昊老师著)
网络编程篇计算机网络: 多台独立的计算机用网络通信设备连接起来的网络.实现资源共享和数据传递. 比如,我们之前的学过的知识可以将D盘的一个文件传到C盘,但如果你想从你的电脑传一个文件到我的电脑上目前是 ...
- 阿里巴巴直播内容风险防控中的AI力量
直播作为近来新兴的互动形态和今年阿里巴巴双十一的一大亮点,其内容风险监控是一个全新的课题,技术的挑战非常大,管控难点主要包括业界缺乏成熟方案和标准.主播行为.直播内容不可控.峰值期间数千路高并发处理. ...
- 直播内容不合规怎么办?智能AI为您解决审核难题
背景 近些年来,视频直播快速发展,大量的直播平台如雨后春笋一般出现,但是这同样给直播内容的监管带来了巨大的挑战,一方面国家对于直播内容监管的要求日益严格,另一方面相对于文字内容的审核,多媒体内容的审核 ...
- Java分布式互联网架构/微服务/高性能/springboot/springcloud 2018年10月17日直播内容
2018年10月17日直播内容 大规模并发必备的消息中间件技术ActiveMq 网盘链接: https://pan.baidu.com/s/1GlxsZ2JnrvX- YN16-S7lQw 提取码: ...
- Java分布式互联网架构/微服务/高性能/springboot/springcloud2018年10月16日直播内容
2018年10月16日直播内容 架构师揭秘springboot对springmvc的自动配置原理 直播地址:https://ke.qq.com/course/179440?tuin=9b386640 ...
- 直播内容大面积偏轨:都是high点的错?
当下的直播行业看似火爆,却是外强中干.直播平台数量的暴增.主播人数的飙升.直播内容同质化严重等问题,都在成为新的行业症结.而面对复杂的情况,不仅刚入行的小主播,就连爆红的大主播都感到寒冬的难熬.为了能 ...
- 元昊讲django框架
一 什么是web框架? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. 对于所有 ...
- 转:鏖战双十一-阿里直播平台面临的技术挑战(webSocket, 敏感词过滤等很不错)
转自:http://www.infoq.com/cn/articles/alibaba-broadcast-platform-technology-challenges 鏖战双十一-阿里直播平台面临的 ...
- .Net训练营优惠有条件 做到立减800元大钞
.NET 是 Microsoft XML Web services 平台.XML Web services 允许应用程序通过 Internet 进行通讯和共享数据,而不管所采用的是哪种操作系统.设备或 ...
随机推荐
- LeetCode: Median of Two Sorted Arrays 解题报告
Median of Two Sorted Arrays There are two sorted arrays A and B of size m and n respectively. Find t ...
- python 高阶函数 map lambda filter等
map 描述 map() 会根据提供的函数对指定序列做映射. 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表. ...
- 【Unity笔记】角色的移动方法
方法一:改变物体的transform public class ExampleClass : MonoBehaviour { ; // 跟随摄像机的移动要写在LateUpdate中 void Late ...
- mysql中使用正则表达式查询
正则表达式功能确实很强大,那天专门抽空学学,这里就暂时在mysql查询中用用. 正则表达式强大而灵活,可以应用于非常复杂的查询. 选项 说明(自动加匹配二字) 例子 匹配值示例 ^ 文本开始字符 '^ ...
- [sz,rz]使用sz/rz在两台Linux设备之间传输数据
转自:https://superuser.com/questions/604055/using-rz-and-sz-under-linux-shell zsend #!/bin/sh DEV=/dev ...
- HTML——图片自动轮换和手动轮换
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 4种用于构建嵌入式linux系统的工具_转
转自:4种用于构建嵌入式linux系统的工具 Linux 被部署到比 Linus Torvalds 在他的宿舍里开发时所预期的更广泛的设备.令人震惊的支持了各种芯片,使得Linux 可以应用于大大小小 ...
- linux中mysql表名默认区分大小写导致表找不到的问题
天将window的项目迁移到linux上面,然后登录时一直报用户表找不到的错误信息. 检查发现数据库中的表名是m_user, 后来才想起来是大小写问题, 找到问题原因,解决方案如下: 修改/etc/m ...
- 用户数据验证的正确姿势之assert
用户数据验证灰常重要, 不用多说了, 但是实现方法(准确的说是表现形式)有很多人, 如何优雅的完成一个后端验证过滤器是一个值得考量的问题, 我尝试过许多方法, 比如validator.js模块, ex ...
- Qt的窗口的最大化。
1.window.showFullScreen()//此方法只对顶级窗口有效,对子窗口无效 QT中窗口部件QWidget成员函数showFullScreen();是用于将窗口部件全屏显示,但是他只对窗 ...