欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

day21_步入百万年薪的第二十一天——面向对象初识、结构、从类名研究类、从对象研究类、logging模块进阶版

程序员文章站 2022-07-21 17:48:36
day21 面向对象的初识 面向对象第一个优点: 对相似功能的函数,同一个业务下的函数进行归类,分类. 想要学习面向对象必须站在一个上帝的角度去分析考虑问题. 类: 具有相同属性和功能的一类事物. 对象:某个类的具体体现. 汽车: 汽车类, 楼下停着一个车牌号为9nb11的奥迪对象. 猫科类: 类. ......

day21

面向对象的初识

面向对象第一个优点: 对相似功能的函数,同一个业务下的函数进行归类,分类.

想要学习面向对象必须站在一个上帝的角度去分析考虑问题.
类: 具有相同属性和功能的一类事物.
对象:某个类的具体体现.

汽车: 汽车类, 楼下停着一个车牌号为9nb11的奥迪对象.
猫科类: 类. 陈硕家的养的那个大橘.对象.
鸡类: 一个类. 家里养的一只鸡.
男神:是一类. 太白对象.

面向对象的第二优点: 你要站在上帝的角度构建代码,类就是一个公共的模板,对象就是从模板实例化出来的.
得到对象就得到了一切.

# 面向过程编程vs函数
面向过程编程
# s1 = 'fdskajfdfsdfs'
# count = 0
# for i in s1:
#     count += 1
# print(count)

# l1 = [i for i in range(10)]
# count = 0
# for i in l1:
#     count += 1
# print(count)

函数# 减少了重复代码,增强了可读性
# l1 = [i for i in range(10)]
# def my_len(argv):
#     count = 0
#     for i in argv:
#         count += 1
#     print(count)
# my_len(l1)

# 函数式编程vs面向对象编程
函数式编程
def login():
    pass

def register():
    pass

def shopping_car():
    pass

def change_pwd():
    pass

def check_paid_goods():
    pass

def check_unpaid_goods():
    pass

面向对象编程
class auth:

    def login(self):
        pass

    def register(self):
        pass

    def change_pwd(self):
        pass

class shopping:

    def shopping_car(self):
        pass

    def check_paid_goods(self):
        pass

    def check_unpaid_goods(self):
        pass
'''
面向对象第一个优点: 对相似功能的函数,同一个业务下的函数进行归类,分类.

想要学习面向对象必须站在一个上帝的角度去分析考虑问题.
    类: 具有相同属性和功能的一类事物.
    对象:某个类的具体体现.

汽车: 汽车类, 楼下停着一个车牌号为9nb11的奥迪对象.
猫科类: 类. 陈硕家的养的那个大橘.对象.
鸡类: 一个类. 家里养的一只鸡.
男神:是一类. 太白对象.

面向对象的第二优点: 你要站在上帝的角度构建代码,类就是一个公共的模板,对象就是从模板实例化出来的.
得到对象就得到了一切.
'''

面向对象的结构

类的命名为驼峰式

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

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

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

从类名的角度研究类

类名操作类的属性

类名查看类中所有的内容
print(human.__dict__)
类名操作类中的静态属性 万能的点.
增:
# human.body = '有头和四肢'
删:
# del human.mind
改:
# human.mind = 'liye脑残'
查:
# print(human.language)
# class human:
#     """
#     类的具体结构
#     """
#     # 第一部分:静态属性
#     mind = '有思想'   # 类的属性  (静态属性, 静态字段)
#     language = '使用语言'
#
#     # 第二部分: 动态方法
#     def work(self):
#         print('人类都会工作')
#
#     def eat(self):
#         print('人类都需要吃饭')

# 类名操作类中的属性
#   1. 类名查看类中所有的内容
# print(human.__dict__)
#   2. 类名操作类中的静态属性  万能的点.
增:
# human.body = '有头和四肢'
删:
# del human.mind
改:
# human.mind = 'liye脑残'
查:
# print(human.language)
# print(human.__dict__)

类名调用类的方法

# 类名调用类中的方法(一般类中的(静态方法,类方法)方法不会通过类名调用)
human.work(111)
总结

​ 一般类名就是操作类中的属性.

从对象的角度研究类

什么是对象

​ 对象是从类中出来的,只要是类名加上(),这就是一个实例化过程,这个就会实例化一个对象。

实例化对象发生了三件事
  • 开辟一个对象空间.
  • 自动执行______init______方法,并且将对象地址传给self.
  • 运行______init______方法内的代码,给对象空间封装属性.
对象操作对象属性
  • 对象查看对象的空间的所有属性
# obj = human('李业',18)
# print(obj.__dict__)
  • 对象操作对象空间的属性
# 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()
# 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

self是什么?

self 本身来说就是类中的方法的第一个位置参数,他会自动接收对象内存地址

一个类可以实例化多个对象

# 一个类可以实例化多个对象
# obj1 = human('李业',18)
# obj2 = human('小可爱', 16)
# obj3 = human('怼姐', 18)

logging模块

  • 系统日志:

    记录操作系统、服务器的硬件性能状态(cpu、网卡、内存运行),将你获取到的参数通过日志写入文件中,记录运维人员的命令

  • 网站日志

    用户的访问次数,用户的停留时间,访问量,各地区的访问量等等

  • 开发辅助日志

    debug、info模式、代替print

    try:

    ​ 错误

    except

    ​ 日志记录

  • 用户信息日志

    记录用户的转账,流水等用户对系统的操作

更改版
"""
logging配置
"""

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 = '在 %(asctime)s %(message)s'

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


# 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': 1024*1024*1024,  # 日志大小 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()
完全版
"""
logging配置
"""

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': logfile_path,  # 日志文件
            '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 load_my_logging_cfg():
    logging.config.dictconfig(logging_dic)  # 导入上面定义的logging配置
    logger = logging.getlogger(__name__)  # 生成一个log实例
    logger.info('it works!')  # 记录该文件的运行状态

if __name__ == '__main__':
    load_my_logging_cfg()

logger配置文件