面向对象的程序设计的核心是对象(上帝式思惟),要理解对象为什么物,必须把本身当成上帝,上帝眼里世间存在的万物皆为对象,不存在的也能够创造出来。python
类:就是具备相同属性和功能的一类事物。编程
对象:就是类的具体表现。函数式编程
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__) 2. 类名调用类中的方法(通常类中的(静态方法,类方法)方法不会经过类名调用) 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__)
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()
obj1 = Human('李业',18) obj2 = Human('小可爱', 16) obj3 = Human('怼姐', 18) 变量,函数名: age_of_oldboy = 73 Ageofoldboy
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': 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()