面向对象回顾01

面向对象初识
1.函数式编程 对 面向过程编程的两个特点
减少代码的重复性
增强代码的可读性
2.面向对象编程 对 面向过程编程
2.1 什么是面向对象
​ 面向对象的程序设计的核心是对象(上帝式思维),要理解对象为何物,必须把自己当成上帝,上帝眼里世间存在的万物皆为对象,不存在的也可以创造出来。

2.2 什么是类,什么是对象
​ 类:就是具有相同属性和功能的一类事物。

​ 对象:就是类的具体表现。

3.类的结构
class Human:
"""
此类主要是构建人类
"""
mind = '有思想' # 第一部分:静态属性 属性 静态变量 静态字段
dic = {}
l1 = []
def work(self): # 第二部分:方法 函数 动态属性
print('人类会工作')
class 是关键字与def用法相同,定义一个类。
Human是此类的类名,类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头。
类的结构从大方向来说就分为两部分:
静态变量。
动态方法。
从类名的角度研究类
class Human:
"""
类的具体结构
"""
# 第一部分:静态属性
mind = '有思想' # 类的属性 (静态属性, 静态字段)
language = '使用语言'
# 第二部分: 动态方法
def work(self):
print('人类都会工作')
def eat(self):
print('人类都需要吃饭')

  1. 类名操作类中的属性
    1. 类名查看类中所有的内容
      print(Human.__dict__)
    2. 类名操作类中的静态属性 万能的点.

增:
Human.body = '有头和四肢'
删:
del Human.mind
改:
Human.mind = 'liye脑残'
查:
print(Human.language)
print(Human.__dict__)

  1. 类名调用类中的方法(一般类中的(静态方法,类方法)方法不会通过类名调用)
    Human.work(111)

总结:
一般类名就是操作类中的属性.
从对象角度研究类
class Human:
"""
类的具体结构
"""
# 第一部分:静态属性
mind = '有思想' # 类的属性 (静态属性, 静态字段)
language = '使用语言'
def init(self):
# print(f'self---->: {self}')
# print(666)
self.name = '李业'
self.age = 18

# 第二部分: 动态方法
def work(self):
    print('人类都会工作')

def eat(self):
    print('人类都需要吃饭')

obj = Human() # 实例化过程
得到一个返回值,这个返回值就是 对象,实例.
print(f'obj---> {obj}')
实例化一个对象发生了三件事:
'''
1. 开辟一个对象空间.
2. 自动执行__init__方法,并且将对象地址传给self.
3. 运行__init__方法内的代码,给对象空间封装属性.

'''

class Human:
"""
类的具体结构
"""
# 第一部分:静态属性
mind = '有思想' # 类的属性 (静态属性, 静态字段)
language = '使用语言'

def __init__(self, name, age):
    # print(f'self---->: {self}')
    # print(666)
    self.n = name
    self.a = age


# 第二部分: 动态方法
def work(self):
    # print(f'self---> {self}')
    print(f'{self.n}都会工作')


def eat(self):
    print(f'{self.n}都需要吃饭')

obj = Human('李业',18) # 实例化过程
print(obj.n)
print(obj.a)
print(obj.__dict__)
对象操作对象空间的属性

  1. 对象查看对象的空间的所有属性
    obj = Human('李业',18)
    print(obj.__dict__)
  2. 对象操作对象空间的属性
    obj = Human('李业',18)
    增:
    obj.sex = 'laddy_boy'
    删:
    del obj.a
    改:
    obj.a = 1000
    查:
    print(obj.n)
    print(obj.__dict__)
    对象查看类中的属性
    obj = Human('李业',18)

    print(obj.mind)

    obj.mind = '无脑的'
    print(obj.mind)
    print(Human.mind)
    对象调用类中的方法
    obj = Human('孙戴维', 23)

    print(f'obj---> {obj}')

    obj.work()
    obj.eat()
    一个类可以实例化多个对象
    obj1 = Human('李业',18)
    obj2 = Human('小可爱', 16)
    obj3 = Human('怼姐', 18)

变量,函数名:
age_of_oldboy = 73
Ageofoldboy
logging旗舰版使用
import logging.config

定义三种日志输出格式 开始

standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d][%(levelname)s][%(message)s]' #其中name为getlogger指定的名字

simple_format = '在 %(asctime)s %(message)s'

id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'

log文件的全路径

logfile_path = 'all2.log'

log配置字典

LOGGING_DIC = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': standard_format
},
'simple': {
'format': simple_format
},
},
'filters': {},
'handlers': {
#打印到终端的日志
'stream': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': 'simple'
},
#打印到文件的日志,收集info及以上的日志
'file': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard',
'filename': None, # 日志文件
'maxBytes': 102410241024, # 日志大小 5M
'backupCount': 5,
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
},
'loggers': {
#logging.getLogger(name)拿到的logger配置
'': {
'handlers': ['stream', 'file'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)传递
},
},
}

def get_logger():
path = r'F:\s24\day21\liye.log'
LOGGING_DIC['handlers']['file']['filename'] = path
logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置
logger = logging.getLogger(name) # 生成一个log实例
return logger

def save():
logger = get_logger()
logger.info(f'{} 存入300元') # 记录该文件的运行状态

save()

posted on 2019-08-02 21:56  七橼77 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/-777/p/11291422.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值