Python知识点整理(3) —— 编程范式

编程范式

面向对象

OOP

  • 对象抽象成类
  • 数据封装、继承、多态

组合与继承

  • 组合(使用其他类的实例当作自己的属性 has-a)
  • 继承(子类继承父类的属性和方法 is-a)
  • 优先使用组合

类变量&实例变量
classmethod & staticmethod

class Person:
	country = "China" # 类变量
	def __init__(self, name):
		self.name = name # 实例变量/属性
	@classmethod # classmethod
	def print_country(cls):
		print (cls.country)
	@staticmethod # staticmethod:其实可以放在外面(处于组织的需要)
	def join_name(first_name, last_name):
		return last_name + first_name

元类(meta class)

  • 元类允许我们控制类的生成,比如修改类的属性
  • 使用type来定义元类
  • 元类最常见的使用场景:ORM框架
# 这两种定义是完全相同的
class x:
	a = 1
xx = type('x', (object,), dict(a = 1)) # 参数分别表示:类名,基类,字典 

装饰器

decorator

  • python中一切皆对象
  • 接受一个函数作为参数,在不修改原来的函数的情况下,增添功能,返回一个新的函数
  • 通过@来使用装饰器
  • 使用场景:打印日志
  • 使用函数编写装饰器
import time
def log_time(func): # 接受一个函数作为参数
	def _log(*args, **kwargs): # 可以接受所有参数
		beg = time.time()
		res = func(*args, **kwargs)
		print ('use time:{}'.format(time.time()-beg))
		return res
	return _log
	
@log_time # @是装饰器语法糖
def mysleep():
	time.sleep(1)
mysleep()		
# 和上面等价的调用方式
newsleep = log_time(mysleep)
newsleep()
  • 使用编写装饰器
import time
class LogTime:
	def __call__(self, func):
		def _log(*args, **kwargs):
			beg = time.time()
			res = func(*args, **kwargs)
			print ('use time:{}'.format(time.time()-beg))
			return res
		return _log
		
@LogTime() # 注意:加括号是为了初始化类的实例
def mysleep():
	time.sleep(1)
mysleep()
  • 给装饰器增加参数
import time
class LogTime:
	def __init__(self, use_int = False):
		self.use_int = use_int
	def __call__(self, func):
		def _log(*args, **kwargs):
			beg = time.time()
			res = func(*args, **kwargs)
			if self.use_int:
				print ('use time:{}'.format(
					int(time.time()-beg))
				)
			else:
				print ('use time:{}'.format(
					time.time()-beg)
				)
			return res
		return _log
		
@LogTime(True) # 注意:加括号是为了初始化类的实例
def mysleep():
	time.sleep(1)
mysleep()

设计模式:创建型

工厂模式

  • 解决对象创建问题
  • 解耦对象
  • 工厂方法 & 抽象工厂

构造模式

  • 创建表示分离:买电脑,工厂模式直接给你需要的电脑;构造模式允许diy电脑的配置

原型模式

  • 使用相同的原型,通过修改部分属性来创建新的事例

单例模式

  • 一个类创建出来的对象都是同一个
  • python的模块是单例的,只会导入一次
  • 使用共享同一个实例的方式来创建单例模式
  • 通过单例模式可以保证系统中,应用该模式的一个类只有一个实例
class Singleton:
	"""
	基于__new__的方法实现单例模式:每次创建一个新的实例的时候,都会使用_instance来作为共享的实例
	这种方法的好处:不需要为了保证线程安全在内部加入锁
	原理:当我们实例化一个对象时,是先执行了类的__new__方法(我们没写时,默认调用object.__new__),实例化对象;然后再执行类的__init__方法,对这个对象进行初始化,所有我们可以基于这个,实现单例模式
	
	详见:https://www.cnblogs.com/huchong/p/8244279.html#_lab2_1_0 
	"""
	def __new__(cls, *args, **kwargs): # __new__() 创建实例
		if not hasattr(clas, '_instance'): # _instance表示所有的共享实例,如果当前的类没有_instance这个实例,则创建
			_instance = super().__new__(cls, *args, **kwargs)
			cls._instance = _instance
		return cls._instance
class MyClass(Singleton):
	pass

c1 = MyClass()
c2 = MyClass()
assert c1 is c2 # c1、c2的id是相同的,验证了c1和c2是同一个实例

设计模式:结构型

设计模式:行为型

相关文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值