面向对象多继承,网络编程,编写网络相关程序
一丶面向对象多继承
1.先找左边再找右边
class A(object): pass class B(object): def f1(self): print('B') class C(A,B): pass obj = C() obj.f1()
2.经典类和新式类
经典类:
新式类如果自己或者自己的前辈只要有人继承object,那么此类就是新式类
新式类:
经典类和新式类的查找成员的顺序不一样
经典类,一条路走到黑(深度优先)
新式类,c3算法实现(python2.3时更新c3算法)
class A(object): pass class B(A): pass class C(B): pass class D(object): pass class E(D,C): pass class F(object): pass class G(F): pass class H(C,G): pass class Foo(E,H): pass # print(E.__mro__) # print(H.__mro__) """ L(Foo + L(E) + L(H) ) L(E) = E,D,C,B,A,object L(H) = H,C,B,A,G,F,object Foo = (object) + (G,F,object) Foo,E,D,H,C,B,A,G,F,object """ print(Foo.__mro__)
Foo + (C,D,F,G) + (G,D,G,W) + (I,G,D,G,W)
Foo, I,B
注意事项:super 是遵循__mro__执行顺序
获取第一个表头,和其它表位进行比较
不存在则拿走
如果存在,则放弃,然后获取第二个表的表头再次和其他表的表尾进行比较.
在python 3.x中取消了经典类,默认都是新式类,并且不必显式的集成object
也就是说
class Person(object):pass class Person():pass class Person:pass 三种写法并无区别,推荐第一种
但是在python 2.x中,默认都是经典类,只有显式继承了object才是新式类,
即:
class Person(object):pass 新式类写法 class Person():pass 经典类写法 class Person:pass 经典类写法
作者:王猫猫 链接:https://www.zhihu.com/question/19698598/answer/12704353 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 1. print不再是语句,而是函数,比如原来是 print 'abc' 现在是 print('abc')但是 python2.6+ 可以使用 from __future__ import print_function 来实现相同功能> 2. 在Python 3中,没有旧式类,只有新式类,也就是说不用再像这样 class Foobar(object): pass 显式地子类化object但是最好还是加上. 主要区别在于 old-style 是 classtype 类型而 new-style 是 type类型> 3. 原来1/2(两个整数相除)结果是0,现在是0.5了python 2.2+ 以上都可以使用 from __future__ import division 实现改特性, 同时注意 // 取代了之前的 / 运算> 4. 新的字符串格式化方法format取代%错误, 从 python2.6+ 开始已经在str和unicode中有该方法, 同时 python3依然支持 % 算符> 5. xrange重命名为range同时更改的还有一系列内置函数及方法, 都返回迭代器对象, 而不是列表或者 元组, 比如 filter, map, dict.items 等> 6. !=取代 < > python2 也很少有人用 < > 所以不算什么修改> 7. long重命名为int不完全对, python3 彻底废弃了 long+int 双整数实现的方法, 统一为 int , 支持高精度整数运算.> 8. except Exception, e变成except (Exception) as e只有 python2.5 及以下版本不支持该语法. python2.6 是支持的. 不算新东西> 10. exec变成函数类似 print() 的变化, 之前是语句.
二丶 网络编程
1.软件
客户端:cs架构,client -> server
浏览器:Bs架构 browser ->server
2.如何实现相互通信
需求一: 编写两个软件(软件之间互相通信)
需求二:两个人直接连接
需求三:局域网互联
3.基于socket模块实现网络通信
为什么要向网络通信发送的是字节,而不是字符串?
py.3 send/recv 都是字节
py.2send/recv都是字符串
服务器端:
accept 阻塞:等待客户端连接.
recv 阻塞:等待服务器发来数据
客户端:
connect 阻塞一直在连接,直到连接成功才往下运行其他代码
recv, 阻塞:等待服务器发来的数据
import socket server = socket.socket() server.bind(('192.168.13.155',8001)) server.listen(5) while True: conn,addr = server.accept() # 字节类型 while True: data = conn.recv(1024) # 阻塞 if data == b'exit': break response = data + b' SB' conn.send(response) conn.close()
# by luffycity.com import socket client = socket.socket() # 王晓东向服务端发起连接请求(递伞) # 阻塞,去连接,直到连接成功后才会继续向下走。 client.connect(('192.168.13.155',8000)) # # 链接上服务端后,向服务端发送消息 client.send(b'hello') # 王晓东等待服务端给他发送消息 data = client.recv(1024) print(data) # 关闭自己 client.close()
# by luffycity.com import socket sk = socket.socket() sk.connect(('192.168.13.155',8001)) while True: name = input("请输入姓名:") sk.send(name.encode('utf-8')) # 字节 if name == 'exit': break response = sk.recv(1024) # 字节 print(response.decode('utf-8')) sk.close()