类的静态方法:
正常:
添加静态方法:
就会变成一个函数,不会自动传self 参数,不会调用类的变量和实例的变量 不在需要self
名义上归类管,但是它就是一个单独的函数,不在需要传入self,想怎么写就怎么写
类似于:
就是一个os类里有许多的可用的函数方法,相当于一个工具包
静态方法只对下面一个函数有作用, 其实就是一个装饰器
正确使用方法:
但是不能传变量,想传变量:
使用方法:
真正赋值:
想删除此变量 就删除
整合:
类的特殊成员方法:
写好注释
返回C 是从哪里导入的
输出类
不加这个方法:
加入__call__ 方法:
或者这样写:
运行结果:
以一个字典的形式把类里的属性,方法 打印出来
通过实例调用,只打印实例变量:
作用: 可以查看实例里有什么变量(属性)
没有的话:
加上:
设置:
获取:
删除: 不是真的删除,就是走到这一步,执行这个函数
Foo 就是来自于type Foo 后面的类就是type 类
特殊方法创建类:
实例化:
new 方法 是自动执行并先于init执行
call 来创建 new
反射:
示例:
实现: 但是这样不行,所以需要用反射实现
正确方法:
1 通过 判断有没有这个方法:
用反射实现:
调用
如果没有就没有,报错,所以需要提前加一个判断
来真正调用: 加上()
真正正常使用:
来定义一个:
实践:
class Dog(object):
def __init__(self,name):
self.name = name
def eat(self):
print("{_who} is eat food".format(_who=self.name))
d1 = Dog("dang")
print(d1.name)
chose = input("input:>>").strip()
#判断实例里是否有此方法或者属性
# if hasattr(d1,chose):
# print("hava",chose)
# else:
# print("not have",chose)
#如果有这个方法执行这个方法(属性的话直接使用,不能执行)
if hasattr(d1,chose):
func = getattr(d1,chose)
func()
else:
print("not have", chose)
# #改变实例中的属性
# if hasattr(d1,chose):
# setattr(d1,chose,"heheh")
# else:
# print("not have",chose)
#
#删除实例中的属性
if hasattr(d1,chose):
delattr(d1,chose)
else:
print("not have",chose)
print(d1.name)
hasattr 判断实例中是否有此属性或方法
getattr 获取属性 或 者执行方法
setattr 改变属性(变量)
delattr 删除属性
可以 判断 有就取出来,没有就设置然后出去来
异常处理:
使用 as 获取错误结果:
处理多个异常:
用在最后面抓所有未知错误:
finally 不管有没有错都执行
常见的几种异常:
自定义错误:
触发自己写的异常:
Socket 网络编程
协议类型:
套接字类型
示例:
client:
import socket
client = socket.socket()
client.connect(('localhost',6868))
client.send(b"Hello world!")
data = client.recv(1024)
print('recv:',data)
client.close()
server:
import socket
server = socket.socket()
server.bind(('localhost',6868)) #绑定要监听的地址
server.listen() #开始监听
print('我要开始等电话了')
conn,addr = server.accept() #等待电话打过来,接收客户端地址
print(conn,addr)
print('电话来了')
data = conn.recv(1024)
print('recv:',data)
conn.send(data.upper())
server.close()
所有数据传输必须用byte 格式
循环接收一个客户端
改进 循环接收多个客户端而不推出
最大允许多个连接,在一个通讯时,可以有几个等待的 在排队的 一般写5个 不到10个
不能send 空 必须做一个判断 如果是空就不发