一、单例模式

单例:这个类只能创建一个实例

单例模式:主要目的是确保某一个类只有一个实例存在。 ----不论实例化多少次,都只创建一个对象

class A:
pass
a = A()
b = A()
print(id(a))
print(id(b))
输出:2317451431888
2317451431840

一入python深似海,从此妹纸是路人(九)_创建对象

实现单例 ----不论实例化多少次,都只创建一个对象

思路:

1.判断对象存不存在
2.如果对象不存在,则创建对象
3.如果对象存在,则引用对象
1.__new__()

class K():
ins = None
def __new__(cls, *args, **kwargs):
if cls.ins is None: # 不存在则创建
cls.ins = object.__new__(cls) # 创建对象
return cls.ins
else: # 对象存在时
return cls.ins
k1 = K()
k2 = K()
print(id(k1))
print(id(k2))
输出:2312549691296
2312549691296

一入python深似海,从此妹纸是路人(九)_创建对象_02

2.hasattr() 判断对象是否包含对应的属性或方法;

实现单例

class A:
b = 88
def test(self):
print('这是test')
a = A()
print(hasattr(a, 'b')) # True
print(hasattr(a, 'test')) # True

一入python深似海,从此妹纸是路人(九)_实例化_03

class A:
def __new__(cls, *args, **kwargs):
if not hasattr(cls,'ins'):
cls.ins = super().__new__(cls)
return cls.ins
a = A()
b = A()
print(id(a))
print(id(b))
输出:1993359494928
1993359494928

一入python深似海,从此妹纸是路人(九)_静态方法_04


二、魔法方法

dir() 查看所有的属性和方法

class A:
pass
print(dir(A))


__doc__ 获取到注释内容

class A: """这是类的注释""" def funa(self): pass print(A.__doc__) 输出:这是类的注释


2.__module____class__

模块 --- 包 --- 库

导入模块

import random
from random import randint
from b import A
a = A()
print(a.__module__) # b 输出的是模块名
print(a.__class__) # <class 'b.A'> 输出类名

一入python深似海,从此妹纸是路人(九)_创建对象_05

3.__call__() 允许一个类的实例像函数一样被调用

class A:
def __init__(self):
print('init')
def __call__(self, *args, **kwargs):
print('这是call')
a1 = A() # 实例化一个对象
# a1.__call__() # 对象名.方法名()
a1()


__dict__ :查看属性或方法
class A:
mind = '呵呵'
def __init__(self,name):
self.name = name
def func(self):
print(123)
print(A.__dict__)

一入python深似海,从此妹纸是路人(九)_创建对象_06

三、装饰器

装饰器:给函数添加额外的功能;

用装饰器的好处:做了封装,代码可以不变,可以不断复用;

装饰器的本质是闭包;

装饰器精髓处:它把真正要执行的业务函数作为参数,传入到装饰器中

装饰器 ---- 执行装饰器即在执行业务函数的基础上再添加额外功能

法一:

def outerf(func):   # func为真正要执行的业务函数的形参
def innerf():
res = func() # 执行业务函数
print('支付完成') # 添加的额外功能
return res
return innerf

一入python深似海,从此妹纸是路人(九)_创建对象_07

真正要执行的业务函数

def f1():
print('这是一个支付功能')

t = outerf(f1)
t()

一入python深似海,从此妹纸是路人(九)_静态方法_08

法二: @ 语法糖

def outerf(func):   # func为真正要执行的业务函数的形参
def innerf():
res = func() # 执行业务函数
print('支付完成') # 添加的额外功能
return res
return innerf

一入python深似海,从此妹纸是路人(九)_静态方法_09

# # 真正要执行的业务函数

@outerf
def f1():
print('这是一个支付功能')
# 调用:和原来函数一样
f1()

一入python深似海,从此妹纸是路人(九)_静态方法_10

为什么要使用装饰器

def outerf(func):   # func为真正要执行的业务函数的形参
def innerf():
res = func() # 执行业务函数
print('支付完成') # 添加的额外功能
return res
return innerf

一入python深似海,从此妹纸是路人(九)_创建对象_11

真正要执行的业务函数

@outerf
def f1():
print('这是一个支付宝的支付功能')
@outerf
def f2():
print('这是一个微信的支付功能')
f1()
f2()

一入python深似海,从此妹纸是路人(九)_创建对象_12

内置装饰器

1) 静态方法 staticmethod() 相当于放在类里的纯函数

# # 不需要访问实例属性或方法 也不需要访问类属性或方法时可以设置为静态方法

class Cat():
# def jiao(self):
# print('喵喵叫')
@staticmethod
def jiao():
print('喵喵叫')
cat = Cat()
cat.jiao()

一入python深似海,从此妹纸是路人(九)_创建对象_13

2) 类方法 classmethod()让类名能像实例对象一样调用类中的方法和属性
# class Person:
# @classmethod
# def human(cls):
# cls.year = 5000
# print(f'人类进化了{cls.year}年')
# # p = Person()
# # p.human()
# Person.human()

一入python深似海,从此妹纸是路人(九)_静态方法_14

3)@property 属性


class A:
def f1(self):
print(123)
@property
def f2(self):
print(456)
return 'haha'
a = A()
# # a.f1()
t = a.f2 # 通过获取属性的方式来调用
print(t)

一入python深似海,从此妹纸是路人(九)_静态方法_15