前后端知识库 前后端知识库
首页
    • JavaScript
    • React
    • Vue
  • Python
  • Sanic
  • Linux
  • Ansible
归档
GitHub (opens new window)
首页
    • JavaScript
    • React
    • Vue
  • Python
  • Sanic
  • Linux
  • Ansible
归档
GitHub (opens new window)
  • Sanic

  • Python

    • Python 的动态类型介绍
    • 数字类型
    • Set类型
    • 字符串
    • 列表
    • 元组
    • 通用序列
    • 字典
    • 文件
    • 语句和语法
    • 赋值语句
    • 打印
    • if语句
    • loop循环
    • 迭代器和生成器
    • 文档
    • 函数
    • 作用域
    • 参数
    • 函数的高级特性
    • 模块
    • 模块包
    • 模块高级用法
    • 类 class
    • Python命名空间
    • 运算符重载
    • 类的设计模式
    • 类的高级主题
    • 异常
    • 异常对象
    • Unicode与字节串
    • 管理属性
    • 装饰器
    • 元类
    • 执行细节
  • backend
  • Python
devin
2023-09-09

类的设计模式

# 类的设计模式

1.Python 不会执行同名函数的重载,而只会用新对象覆盖旧对象

  class A:
	def func(self,x):
		pass
	def func(self,x,y):
		pass
1
2
3
4
5

由于class、def均为可执行代码,因此func变量名这里被重新赋值了。

同名函数的覆盖

2.委托设计:在 Python 中委托通常以拦截.__getattr__(self,'name')来实现。该方法会拦截对不存在属性的读取

  • 代理类实例对象可以利用.__getattr__(self,'name')将任意的属性读取转发给被包装的对象

  • 代理类可以有被包装对象的借口,且自己还可以有其他接口

    代理类

    3.Python 支持变量名压缩的概念:class语句内以__(两个下划线)开头但是结尾没有__(两个下划线)的变量名(如__x)会自动扩张为包含所在类的名称(如_classname__x)

  • 变量名压缩只发生在class语句内,且仅仅针对__x这种以__开头的变量名

  • 该做法常用于避免实例中潜在的变量名冲突

    class的变量名压缩

    4.Python3 中,实例方法有两种形式:

  • 普通函数方法:通过对类名进行点号运算而获得类的函数属性,如classname.func,会返回普通函数方法。

    • 若调用的是实例方法,必须明确提供实例对象作为第一个参数,如classname.func(obj,arg)
    • 若调用的是一般的方法,则遵守普通函数调用规则即可classname.func(arg)
  • 绑定方法:通过对实例对象进行点号运算而获得类的函数属性,如obj.func,会返回绑定方法对象。Python 在绑定方法对象中,自动将实例和函数打包 _ 绑定方法调用时,不需要手动传入实例对象,如obj.func(arg) _ 绑定方法的__self__属性引用被绑定的实例对象,__func__属性引用该类的该函数对象

    普通方法和绑定方法

    5.多重继承:子类可以继承一个以上的超类。超类在class语句首行括号内列出,以逗号分隔

  • 子类与其实例继承了列出的所有超类的命名空间

  • 搜索属性时,Python 会从左到右搜索class首行中的超类,直到找到匹配的名字

    多重继承

    6.工厂函数:通过传入类对象和初始化参数来产生新的实例对象:

  def factory(classname,*args,**kwargs):
	return classname(*args,**kwargs)
1
2

多重继承

7.抽象超类:类的部分行为未定义,必须由其子类提供

  • 若子类也未定义预期的方法,则 Python 会引发未定义变量名的异常
  • 类的编写者也可以用assert语句或者raise异常来显式提示这是一个抽象类
  class A:
	def func(self):
		self.act() #该方法未实现
	def act(self):
		assert False, 'act must be defined!'
  class ChildA(A):
	def act(self):
		print('in ChildA act')
  x=child()
  x.func()
1
2
3
4
5
6
7
8
9
10

这里的核心在于:超类中self.act()调用时,self指向的有可能是真实的实例对象(子类对象) 抽象超类

编辑 (opens new window)
上次更新: 2023/09/09, 12:09:00
运算符重载
类的高级主题

← 运算符重载 类的高级主题→

Theme by Vdoing | Copyright © 2023-2023 devin | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式