一丶面向对象多继承
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__)
c3算法
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() 的变化, 之前是语句.
python2.x 和 python 3.x的部分区别
二丶 网络编程
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()
客户端二