文章目录 
                     
                  类的高级方法
静态方法
通过@staticmethod装饰器将类中的一个方法转换成静态方法,静态方法不能使用类和实例的变量
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16  | 
						class Dog(object):     def __init__(self, name):         self.name = name     def eat(self):         print("%s is eating" % self.name)     # 静态方法,不能使用类和实例的变量,与类唯一的关联只是需要通过类去调用     @staticmethod     def tips(self):         print("name is %s" % self.name) dog1 = Dog("小黄") dog1.eat() dog1.tips(dog1)  # 调用静态方法必须手工传递参数  | 
					
类方法
通过@classmethod装饰器将类中的一个方法转换成类方法,类方法只能使用类变量,不能使用实例变量
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  | 
						class Dog(object):     eyes = 2     def __init__(self, name, eyes):         self.name = name         self.eyes = eyes     # 类方法只能访问类变量,不能访问实例变量     @classmethod     def eye(cls):         print("%s eyes" % cls.eyes) dog1 = Dog("大黄", 3) dog1.eye()  | 
					
属性方法
通过@property装饰器将类中的一个方法转换成一个属性,再通过装饰器定义属性的setter和deleter方法来完成指定操作
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28  | 
						class Dog(object):     def __init__(self, name, eyes):         self.name = name         self.food = "SS"     # 属性方法,将一个方法转换成属性     @property     def hello(self):         return "hello %s" % self.name     # setter装饰器用于在设置对象属性时调用     @hello.setter     def hello(self, name):         print("hello %s" % name)     # deleter装饰器用于在删除对象时调用(实际上并不是删除属性方法本身)     @hello.deleter     def hello(self):         del self.food dog1 = Dog("大黄", 3) print(dog1.hello)  # 属性方法不是一个可调用对象,不能使用()去调用 dog1.hello = "小黄"  # 为属性赋值,实际上是调用setter装饰的方法 del dog1.hello  # 删除属性,实际上是调用deleter装饰的方法 print(hasattr(dog1, "name")) print(hasattr(dog1, "food"))  # 检查属性是否还存在 print(dog1.hello)  | 
					
类的特殊成员方法
__doc__
__doc__属性表示类的描述信息
| 
					 1 2 3 4 5 6 7 8 9 10 11  | 
						class Dog(object):     """     这是Dog类的说明:     此处省略5000字     """     def __init__(self, name):         self.name = name dog1 = Dog("小黄") # __doc__属性表示类的描述 print(dog1.__doc__)  | 
					
__module__ 和 __class__
 __module__属性表示对象所在的模块
 __class__属性表示对象所在的类
| 
					 1 2 3 4 5 6 7 8 9 10  | 
						class Dog(object):     def __init__(self, name):         self.name = name dog1 = Dog("小黄") # __module__属性表示类所属的模块 print(dog1.__module__) # __class__模块表示类(或实例)所属的类 print(dog1.__class__) print(Dog.__class__)  | 
					
__init__
构造函数,用于对实例进行初始化
__del__
析构函数,用于在实例销毁时进行收尾工作
__call__
__call__方法给将实例变成一个可调用的对象,并调用方法中的操作
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14  | 
						class Dog(object):     """     这是Dog类的说明:     此处省略5000字     """     def __init__(self, name):         self.name = name     def __call__(self, *args, **kwargs):         print("干嘛Call我?") dog1 = Dog("小黄") # 如果在类中定义了__call__方法,在对类的实例进行调用时会触发此方法 dog1()  | 
					
__dict__
__dict__属性获取类或者对象中的所有成员,并以字典方式展示
| 
					 1 2 3 4 5 6 7 8 9 10 11 12  | 
						class Dog(object):     def __init__(self, name):         self.name = name     def hello(self):         print("Hello dog %s" % self.name) dog1 = Dog("小黄") # __dict__属性表示类中所有对象,以字典方式展示 print(dog1.__dict__) print(Dog.__dict__)  | 
					
__str__
__str__方法用于定义在打印实例时的输出,替代默认的内存地址
| 
					 1 2 3 4 5 6 7 8 9 10 11  | 
						class Dog(object):     def __init__(self, name):         self.name = name     def __str__(self):         return "这是一个Dog类" dog1 = Dog("小黄") # 如果在类中定义了__str__方法,则在打印实例时会获取__str__方法的返回值 print(dog1)  | 
					
__getitem__、__setitem__、__delitem__
可以将对象转换成一个自定义的字典,以字典的方式进行存取
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23  | 
						class CustomDict(object):     def __init__(self):         self.data = {}  # 初始化一个空字典用于存储数据     def __getitem__(self, item):         return self.data.get(item)     def __setitem__(self, key, value):         self.data[key] = value     def __delitem__(self, key):         del self.data[key] # 实例化 dic1 = CustomDict() # 触发__setitem__方法 dic1["name"] = "Bob" # 触发__getitem__方法 print(dic1["name"]) # 触发__delitem__方法 del dic1["name"] print(dic1["name"])  | 
					
反射
通过字符串去查找程序运行时的属性或方法,有4个方法
    getattr(object, name, default=None)
    hasattr(object, name)
    setattr(x, y, v)
    delattr(x, y)
		| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36  | 
						class Dog(object):     def __init__(self, name):         self.name = name     def eat(self):         print("%s is eating" % self.name) dog1 = Dog("小黄") # 先定义一个函数备用 def walk(self):     print("%s is walking" % self.name) # hasattr方法判断对象中是否存在指定属性或方法 print(hasattr(dog1, "eat")) print(hasattr(dog1, "walk")) # getattr方法根据字符串在对象中查找并返回匹配的属性或方法 print(getattr(dog1, "eat"))  # 返回函数eat的内存地址 # print(getattr(dog1,"walk"))  # 不存在的属性或方法会报错 # setattr方法设置对象的新属性或方法(方法需要传递一个函数的内存地址) setattr(dog1, "run", walk) dog1.run(dog1) k = input("Key:") v = input("Value:") setattr(dog1, k, v) print(getattr(dog1, k))  # 获取属性,直接返回属性值 # delattr 方法用于删除对象中匹配的方法或属性(不能删除继承的方法) delattr(dog1, "eat") print(hasattr(dog1, "eat"))  | 
					
异常处理
try-except
对运行时的异常进行捕获并处理,对用户输出友好的错误信息
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29  | 
						list1 = ["a", "b", "c"] try:     print(list1[3]) except IndexError as e:  # 捕获指定异常类型,e为异常消息     print("序号错误:", e) dic1 = {"name": "Bob", "age": 16} try:     print(dic1["sex"]) except KeyError as e:  # 捕获指定异常类型,e为异常消息     print("指定Key不存在:", e) path = "C:\System Volume Information"  # 拒绝访问型 # path = "C:\aaa"  # 文件不存在型 # path = "Test"  # 正常打开型 try:     with open(path, "r") as f:         pass except FileNotFoundError as e:  # 捕获指定异常类型,e为异常消息     print("打开文件失败:", e) except PermissionError as e:  # 捕获指定异常类型,e为异常消息     print("拒绝访问:", e) except Exception as e:  # 捕获所有异常类型,e为异常消息     print("出错了:", e) else:  # 当没有异常时的操作     print("打开文件成功") finally:  # 无论是否有异常都会执行的操作     print("操作完成")  | 
					
常用的异常类型
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常;基本上是无法打开文件 ImportError 无法引入模块或包;基本上是路径问题或名称错误 IndentationError 语法错误(的子类) ;代码没有正确对齐 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] KeyError 试图访问字典里不存在的键 KeyboardInterrupt Ctrl+C被按下 NameError 使用一个还未被赋予对象的变量 SyntaxError Python语法错误,代码不能编译 TypeError 传入对象类型与要求的不符合 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量, 导致你以为正在访问它 ValueError 传入一个调用者不期望的值,即使值的类型是正确的
自定义异常类型
| 
					 1 2 3 4 5 6 7 8  | 
						# 自定义错误类型 class MyException(Exception):     pass try:     raise MyException("系统错误。。。。。")  # 手工触发错误 except MyException as e:     print(e)  | 
					
断言
确定条件成立,否则抛出AssertionError异常
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36  | 
						num = input("输入一个数字: ") assert num.isdigit()  # 断言输入的是一个数字 print(int(num)/2) </cpde> <h2>scoket初识</h2> <h3>socket通信流程</h3> <img src="https://www.hujianbo.cn/wp-content/uploads/2019/03/064d59d7f0f510a687c194e8eefa1256_425762-20151212160019653-1079393936.png" alt="socket通信流程" /> <h3>socket server</h3> import socket # 初始化socket对象 server = socket.socket() # 绑定网络地址和端口 server.bind(("127.0.0.1", 8888)) # 开始监听 server.listen(5) print("开始监听...") while True:     # 接受连接,并保存连接对象和对端地址信息     conn, client_addr = server.accept()     print("成功建立连接...", client_addr)     while True:         # 接受数据存入变量         data = conn.recv(1024)         if not data:             print("Client has gone away...")             break         else:             data = data.decode(encoding="utf-8")         print("接收数据完成: ", data)         # 处理数据后发回客户端         conn.send(data.upper().encode(encoding="utf-8"))  | 
					
socket client
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21  | 
						import socket # 初始化socket对象 client = socket.socket() # 连接服务器端地址 print("开始连接服务器...") client.connect(("127.0.0.1", 8888)) print("连接服务器成功") # 循环发送数据 while True:     data = input(">>")     if data == "bye": break     # 发送数据(Python3中必须是bytes类型)     if len(data) == 0: continue     client.send(data.encode(encoding="utf-8"))     # 接收服务器返回的数据     data_back = client.recv(1024).decode(encoding="utf-8")     print(data_back) # 关闭连接 client.close()  | 
					
原文链接:Python 从入门到放弃 - Lesson 7 面向对象进阶,转载请注明来源!
