文章目录
类的高级方法
静态方法
通过@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 面向对象进阶,转载请注明来源!