引言

  我visual studio 2017就算体积巨大、启动巨慢、功能简陋也不会安装PyCharm的,嘿呀,真香。好吧,为了实现socket网络编程,更换了软件。

正文

静态方法

  只是在名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性。例子。

class Student(object):
def __init__(self,name):
self.name = name @staticmethod#静态方法
def name(self):
print('名字是%s'%(self.name)) a = Student('二狗')
a.name()#报错,因为静态方法无法访问实例中的属性

类方法

  与静态方法类似,只能访问类变量,不能访问实例变量。

class Student(object):
name = '二狗'
def __init__(self,name):
self.name = name
@classmethod
def name(self):
print('名字是%s'%(name))
print('名字是%s'%(self.name)) a = Student('蛋蛋')
a.name()#可以打印类中的名字,之后报错

属性方法

  把一个方法变成静态属性。例子。

class Student(object):
def __init__(self,name):
self.name = name @property
def logging(self):
print('%s注册成功'%(self.name)) a = Student('二狗')
a.logging #无需加括号直接运行

  但是,这样无法为属性赋值,也无法删除。为了能够赋值和删除,特增加setter和delte方法。例子。

class Student(object):
def __init__(self,name):
self.name = name @property
def logging(self):
print('%s注册成功'%(self.__newname))
@logging.setter
def logging(self,name):
self.__newname = name
@logging.deleter
def logging(self):
del self.__newname
print('删除') a = Student('二狗')
a.logging = '蛋蛋' # 无需加括号直接运行
del a.logging # 删除

类的特殊方法

  __doc__方法,可以返回类的描述。例子。

class Student(object):
'''用于测试'''
def __init__(self, name):
self.name = name a = Student('二狗')
print(a.__doc__)#打印出:用于测试

  __module__方法,可以返回类所在的模块。例子。

class Student(object):
'''用于测试'''
def __init__(self, name):
self.name = name a = Student('二狗')
print(a.__module__)#打印:__main__

  __class__方法,可以返回类和类所在的模块。例子。

class Student(object):
'''用于测试'''
def __init__(self, name):
self.name = name a = Student('二狗')
print(a.__class__)#打印 : <class '__main__.Student'>

  __call__方法,在类中定义后,可直接由类名() + ()直接运行,或者由对象+()运行。例子。

class Student(object):
'''用于测试'''
def __init__(self, name):
self.name = name
def __call__(self):
print('in the call') Student('二狗')()# 打印:in the call
a = Student('二狗')
a()# 打印: in the call

  __dict__方法,可以查看类:打印类中所有的属性,不包括实例属性。或者查看对象:打印对象所有实例属性,不包括类属性。例子。

class Student(object):
'''用于测试'''
def __init__(self, name):
self.name = name
def __call__(self):
print('in the call') print(Student.__dict__)#打印出了所有类属性
a = Student('二狗')
print(a.__dict__)#只打印:{'name': '二狗'}

  __str__方法,当类中定义了该方法时,打印对象时,默认打印该方法的返回值。例子。

class Student(object):
'''用于测试'''
def __init__(self, name):
self.name = name
def __str__(self):
return 'in the str' a = Student('二狗')
print(a)#打印:in the str

  使类字典化:__getitem__方法,__setitem__方法,__delitem__方法。例子。

class Student(object):
'''用于测试'''
def __init__(self):
self.data = {}
def __getitem__(self, key):
print('__getitem__', key)
return self.data.get(key)
def __setitem__(self, key, value):
print('__setitem__', key, value)
self.data[key] = value
def __delitem__(self, key):
print('__delitem__', key) a = Student() # 实例化
a['name'] = '二狗' # 触发__setitem__
print(a['name']) # 触发__getitem__
del a['name'] # 触发__delitem__

反射

  反射可以用于字符串运行类中的方法。主要有四个用法,hasattr,getattr,setattr和delattr。例子。

class Example(object):
def __init__(self,name):
self.name = name
def eat(self):
print('%s吃了一个苹果'%(self.name)) d = Dog('二狗')
choice = input('>>').strip()#用户输入所需执行的方法
#hasattr,用于判断一个对象是否有名为字符串的方法
print(hasattr(d,choice))#打印:True or False
#getattr,根据字符串去获取对象里的字符串名对应的方法的内存地址,所以运行需要加()
print(getattr(d,choice))#打印方法的内存地址
getattr(d,choice)()#运行方法
#setattr,将某个函数以字符串的名字添加给类中作为方法。
def drink(self):
print('%s在喝'%(self.name))
setattr(d,choice,drink)#将drink以字符串名命名,添加到对象中
#也可用于传入某个属性
setattr(d,choice,None)#将字符串名字的属性传入类中
#delattr,根据字符串去删除对象里的字符串名对应的方法
delattr(d,choice)#删除

动态导入模块 

  动态导入模块可以以字符串的形式动态将模块导入。例子。

#正常导入
from lib import test
#动态导入
mod = __import__('lib.test')#以字符串形式导入
#官方建议使用
import importlib
mod = importlib.import_module(lib.test)

类的起源

  在Python中,一切皆对象,所以类的创建过程背后,也是通过执行某种类的创建办法创建的。通过打印类的type可以发现,类来源于type。所以存在另外一种创建类的方法。例子。

def func(self):
print('hello %s'%(self.name))
def __init__(self,name):
self.name = name
Foo = type('Foo',(object,),{'talk':func, '__init__':__init__})
f = Foo('二狗')
f.talk()

  那么type类的起源又是什么呢?这个可以从下面例子中得到。

class MyType(type):
'''创建自己的type'''
def __init__(self,what,bases=None,dict=None):
print('MyType init')
super(MyType,self).__init__(what,bases,dict) def __call__(self, *args, **kwargs):
print('MyType call')#自定义创建过程
obj = self.__new__(self,*args,**kwargs)
self.__init__(obj,*args,**kwargs) class Foo(object):
__metaclass__ = MyType def __init__(self,name):
self.name = name
print('init') def __new__(cls,*args,**kwargs):
'''类中自带的方法'''
print('new')
return object.__new__(cls)

  例子中,首先运行MyType中的__init__初始化,之后进入__call__用于创建类的__new__,开辟出self的内存空间。之后进入类中的__new__用于调用类中的init。

异常处理

  在编程过程中往往会遇到异常,影响后续程序的运行。通过处理异常可以保证程序在遇到异常后任能够将后续内容执行完毕。方便程序员调试。处理异常的过程如下。例子。

name = ['lala','haha']
data = {}
try:
name[3]
data['name']
except KeyError as e:#将没有Key的错误用e获取
print('没有这个key',e)
except (IndexError, KeyError) as e:#将错误用e获取,括号括起来可同时处理多个异常
print('列表操作错误',e)
except Exception as e:#可以与之前配合使用,这个用于判断未知错误
print('未知错误',e)
else:
print('一切正常')
finally: # 不管有没有错,都会执行
print('最后一步')

  当然,异常也可以自定义,通过自己预先考虑创建一些异常。自定义异常例子。

class NewException(Exception):
def __init__(self,msg):
self.message = msg
def __str__(self): # 默认构建,可以不写
return self.message try:
raise NewException('异常描述')#触发异常方法
except NewException as e:
print(e)

断言

  断言与异常不同,可以根据某个断言来阻止程序继续运行。例子。

a = 'test'
assert type(a) is int#断言正确继续运行,错误停止运行
print(a-2)

socket网络编程

  这个主要就是实现服务器端与客户端之间的信息交流。具体可以通过例子来学习。

  地址簇、类型。需注意官方建议单次传送大小不超过8192。即8K。

#地址簇
#socket.AF_UNIX #unix本机进程间通信
#socket.AF_INET #IPV4
#socket.AF_INET6 #IPV6
#类型
#socket.SOCK_STREAM #tcp/ip
#socket.SOCK_DGRAM #udp
#socket.SOCK_RAW #伪造IP,DDoS A伪造ip1->服务器->返回:等待一段时间/A不响应,伪造ip2->服务器
#socket.SOCK_RDM #可靠的udp 但是不能保证顺序
#使用
import socket
#声明类型
server = socket.socket(AF.INET, sock.SOCK_STREAM)
#绑定IP地址和接口
server.bing(localhost,9999)
#开始接听

  服务器端:

# 服务器端
import socket
server = socket.socket() # 声明socket类型,同时生成socket连接对象
server.bind(('localhost', 9998)) # 绑定端口
server.listen() # 监听
print('开始监听')
conn, addr = server.accept() # 等电话打进来
# conn客户端连过来而在服务器端为其生成的连接实例链接,端口只能同时和1个人通话
print('听到')
while True:
data = conn.recv(1024)
if not data:
print("clinet has lost")
break
print('收到:', data)
conn.send(data.upper()) #转为大写后传回
server.close()

  客户机端:

import socket

client = socket.socket()  # 声明socket类型,同时生成socket连接对象
client.connect(('localhost', 9998))
while True:
msg = input('>>').strip()
if len(msg):
print('不能为空')
continue
client.send(msg.encode('utf-8')) # sendall循环发送全部文件
data = client.recv(1024)
print('recv:', data.decode())

NO.7:自学python之路------类的方法、异常处理、socket网络编程的更多相关文章

  1. NO.4:自学python之路------内置方法、装饰器、迭代器

    引言 是时候开始新的Python学习了,最近要考英语,可能不会周更,但是尽量吧. 正文 内置方法 Python提供给了使用者很多内置方法,可以便于编程使用.这里就来挑选其中大部分的内置方法进行解释其用 ...

  2. Python开发【第*篇】【Socket网络编程】

    1.Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. so ...

  3. python之路--类的约束, 异常处理, MD5, 日志处理

    一 . 类的约束 1. 写一个父类,父类中的某个方法要抛出一个异常 NotImplementedError class Base: # 对子类进行了约束. 必须重写该方法 # 以后上班了. 拿到公司代 ...

  4. Python之路第九天,高级(1)-网络编程

    SOCKET编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. so ...

  5. Python之路(第三十二篇) 网络编程:udp套接字、简单文件传输

    一.UDP套接字 服务端 # udp是无链接的,先启动哪一端都不会报错 # udp没有链接,与tcp相比没有链接循环,只有通讯循环 server = socket.socket(socket.AF_I ...

  6. Python之路(第三十四篇) 网络编程:验证客户端合法性

    一.验证客户端合法性 如果你想在分布式系统中实现一个简单的客户端链接认证功能,又不像SSL那么复杂,那么利用hmac+加盐的方式来实现. 客户端验证的总的思路是将服务端随机产生的指定位数的字节发送到客 ...

  7. 自学Python之路

    自学Python之路[第一回]:初识Python    1.1 自学Python1.1-简介    1.2 自学Python1.2-环境的搭建:Pycharm及python安装详细教程    1.3  ...

  8. 自学Python之路-Python核心编程

    自学Python之路-Python核心编程 自学Python之路[第六回]:Python模块       6.1 自学Python6.1-模块简介    6.2 自学Python6.2-类.模块.包  ...

  9. 自学Python之路-Python基础+模块+面向对象+函数

    自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python    1.1 自学Python1.1-简介    1.2 自学Python1.2-环境的 ...

随机推荐

  1. Java基础加强之集合

    集合整体框架图 各集合框架的概述 1. Collection(常用List和Set,不常用Queue和Vector),单元素集合. 2. Map(常用HashMap和TreeMap,不常用HashTa ...

  2. 【原创】大叔经验分享(53)kudu报错unable to find SASL plugin: PLAIN

    kudu安装后运行不正常,master中找不到任何tserver,查看tserver日志发现有很多报错: Failed to heartbeat to master:7051: Invalid arg ...

  3. 使用nginx替换Ingress

    总感觉k8s Ingress 不可控, 所以使用nginx 替换Ingress,还是比较简单的. apiVersion: extensions/v1beta1 kind: DaemonSet meta ...

  4. js 正则验证

    Html 代码如下: <table> <tr> <td>匹配正整数:</td> <td><input type="text& ...

  5. the django travel three[form表单验证]

    一:表单验证: 场景:因为浏览器的js可以被禁用,所以需要做后台的输入合法的验证. A:ajax发请求.需要注意的是ajax POST的数据的key值和form表单的里的字段名字一致,否则得不到验证! ...

  6. 《Python核心编程》第二版第五章答案

    本人python新手,答案自己做的,如果有问题,欢迎大家评论和讨论! 更新会在本随笔中直接更新. 5-1.整型.讲讲Python普通整型和长整型的区别. Python的标准整形类型是最通用的数字类型. ...

  7. 利用SimpleDateFormat进行时间的跨时区转换 - Java

    * 次方法主要用来将特定时区的时间转换成指定时区的时间,比如将北京时间“2018-04-08 15:40:49.031”,转换对应的美国东部时间是“2018-04-08 03:40:49.031”   ...

  8. iOS蓝牙开发(4.0)详解

    最近由于项目需要, 一直在研究蓝牙4.0,在这儿分享给大家, 望共同进步. 一.关于蓝牙开发的一些重要的理论概念: 1.当前ios中开发蓝牙所运用的系统库是<CoreBluetooth/Core ...

  9. MySQL数据库初始

    MySQL数据库 本节目录 一 数据库概述 二 MySQL介绍 三 MySQL的下载安装.简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 初识sql语句 一 ...

  10. Linux下onvif客户端关于ipc摄像头的搜索

    设备搜索:要访问一个IPC摄像头,或者说要调用IPC摄像头提供的WEB服务接口,就要先知道其IP地址,这就是设备发现的过程,或者叫设备搜索的过程.IPC摄像头用的是239.255.255.250(端口 ...