面向对象初识
1.面向对象的优点:
- 对相似功能的函数,同一个业务下的函数进行归类,分类
- 站在上帝的角度构建代码,类就是一个公共的模板,对象就是从模板实例化出来的,得到对象就得到了一切
学习面向对象必须站在一个上帝的角度去分析考虑问题.
2.类的结构
类:具有相同属性和功能的一类事物.
对象:某个类的具体体现
定义:
class 类名:
类的具体结构
class Human:
#静态属性
mind = "有思想" #类的属性(静态属性,静态字段)
language = "使用语言"
def __init__(self,name,age):
self.name = name
self.age = age
#动态方法
def work(self):
print("人类都会工作")
def eat(self):
print("人类都需要吃饭")
3.从类名的角度研究类
class Human:
mind = "有思想" #类的属性(静态属性,静态字段)
language = "使用语言"
def __init__(self,name,age):
self.name = name
self.age = age
def work(self):
print("人类都会工作")
def eat(self):
print("人类都需要吃饭")
1.类名操作类中的属性
类名查看类中所有的内容
print(Human.__dict__)
类名操作类中的静态属性(万能的点.)
增:
Human.body = "有四肢"
删:
del Human.mind
改:
Human.mind = "live"
查:
print(Human.language)
2.类名调用类中的方法(一般类中的(静态方法,类方法)方法不会通过类名调用)
Human.work(参数)
总结:
一般类名就是操作类中的属性
4.从对象角度研究类
class Human:
mind = "有思想" #类的属性(静态属性,静态字段)
language = "使用语言"
def __init__(self,name,age):
self.name = name
self.age = age
def work(self):
print("人类都会工作")
def eat(self):
print("人类都需要吃饭")
1.什么是对象?
类名() --实例化过程
obj = Human() #得到一个返回值,这个返回值就是对象/实例.
print(obj)
实例化一个对象发生了三件事:
1.在内存中开辟一个对象空间
2.自动执行__init__方法,并且将对象地址传给self
3.运行__init__方法内的代码,给对象空间封装属性
2.对象查看类中的属性
print(obj.mind)
3.对象操作类中的方法
obj.work()
obj.eat()
5.self
self本身来说就是类中的方法的第一个位置参数,它会自动接受对象内存地址
6.一个类可以实例化多个对象
class Human:
mind = "有思想"
language = "使用语言"
def __init__(self,name,age):
self.name = name
self.age = age
def work(self):
print("人类都会工作")
def eat(self):
print("人类都需要吃饭")
obj1 = Human('小胖',18)
obj2 = Human('小红',20)
print(obj1,obj2)
logging模块补充:
1.系统日志
记录操作系统,服务器的硬件性能状态(cpu,网卡,内存运行)将你获取到的参数通过日志写入文件中,记录运维人员的命令.
2.网站日志
用户的访问次数,用户的停留时间,访问量,各地区访问量,等等
3.开发辅助日志
debug,info模式,代替print,try,except
4.用户信息日志
记录用户的转账,流水等用户对系统的操作5
import os
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 = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
# 定义日志输出格式 结束
logfile_dir = os.path.dirname(os.path.abspath(__file__)) # log文件的目录
logfile_name = 'all2.log' # log文件名
# 如果不存在定义的日志目录就创建一个
if not os.path.isdir(logfile_dir):
os.mkdir(logfile_dir)
# log文件的全路径
logfile_path = os.path.join(logfile_dir, logfile_name)
# log配置字典
LOGGING_DIC = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': standard_format
},
'simple': {
'format': simple_format
},
},
'filters': {},
'handlers': {
#打印到终端的日志
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': 'simple'
},
#打印到文件的日志,收集info及以上的日志
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard',
'filename': None, # 日志文件
'maxBytes': 1024*1024*5, # 日志大小 5M
'backupCount': 5,
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
},
'loggers': {
#logging.getLogger(__name__)拿到的logger配置
'': {
'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)传递
},
},
}
def get_logger():
path = os.path.join("登陆用户的log文件的路径")
LOGGING_DIC['handlers']['default']['filename'] = path
logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置
logger = logging.getLogger(__name__) # 生成一个log实例
return logger
#调用时:
def save():
logger = get_logger()
logger.info('It works!') # 记录该文件的运行状态
if __name__ == '__main__':
load_my_logging_cfg()
字典放在settings里面,get_logger放到common文件里面,log文件的全路径也需要改变
字典中的filename 设置成 None