归一化设计
From abc import ABCmeta, abstractmethod
class A(metaclass = ABCmeta):
@abstractmethod
Def payment(self): pass
统一接口,子类就必须有payment方法,否则不能实例化
class B(A):
def payment(self):pass
def pay(obj,money):
obj.payment(money)
或者采用raise Error的方式在调用统一接口的时候
私有属性:
__privatemethod_or_attr
只能在类的内部调用并且不能被子类继承!
@classmethod
只调用类属性的方法
@staticmethod
与类和对象无关的方法
@property
将方法可以成为属性,并调用
Class A:
@property
def a():return 1
obj=A()
obj.a >>>1
@a.setter
Def a(self,new): __a=new 尤其是结合私有属性,注意属性不要和方法名重复!
Obj.a=2 在obj.a= 调用setter里的内容
@a.deleter
同setter,在del 的过程中调用
反射:
Hasattr(obj,’str’) >>>
Getattr(obj,’str’) >>>
Obj可以为module,class or obj
‘str’可以为属性,方法,类
内置方法:
Def __getattr__()
在getattr的时候调用
Def __setattr__():
在setattr的时候用
Def __call__():调用类()的时候用
Def __hash__():return调用hash方法的时候用
Def __new__():实例化对象的时候用可以用来设置单例
Class A:
def __new__(self,new):
__a = None
if a: __a=object.__new__()
def __len__调用len()的时候调用
def __eq__调用==的时候调用设置类的判断条件
__str__ print的时候用
__repr__repr()的时候调用,repr更加实用,在__str__没有的时候可以补充
Def __del__():在del的时候调用
Item 系列:
在__getitem__在定义对象的索引obj[0]或者切片obj[0:9]的时候用
__setitem__定义对象的索引等于
__delitem__定义对象的删除
Isinstance 相比type更加好用在多个夫类的多重夫类的时候依然管用
issubclass
包和模块:
模块
通过sys.modules可以查看该脚本调用了什么模块!
模块是.py
导入模块用import modulename as newname (调用方法或者属性需要modulename.func() or modulename.attr)
模块导入需要尽量不要 import module_a, module_b
直接导入模块中的方法 from modulename import funcname as new_func_name, funcname1 as New_func_name(调用里面的方法可以不用直接使用属性或者方法名,注意避免和自己的脚本中的属性重名!)可以调用dir(modulename)来查看module里面的属性名,避免重复!
From modulename import (func1,
Func2,
Func3)
引用的module有自己的命名空间!
可以用from module import *调用module中所有的公有属性和方法 其中module中的__all__=[‘money‘,‘read1‘]可以用来调控调用内容
Attention:
导入会运行程序所以可以利用
Def __name__==’__main__’:
Func()
方法来判断是否是在运行该脚本还是在调用该脚本,而防止在调用的时候就执行!
如果调用了引用模块的模块,不需再次引用模块!
在测试的时候可以用import importlib; importlib.reload(modulename)
编译文件python会在第一次调用模块的时候生成pyc文件,方便之后调用加快速度
包:
包和文件夹的区别:包中有__init__.py文件
创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包即模块
包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间
可以import package.module or from package1.package2 import module or from package1.package2.module import func_attr
__init__py在调用包或者包内的内容的时候都会执行
如果调用的是包如import package 是不能调用里面的module或者module.func的
所以可以再__init__.py中写入调用package中的module 这样就可以调入顶层的包就可以啦!
绝对路径和相对路径:
相对路径以.\filename或者..\filename开头代表同目录下以及上一层目录下的文件夹
绝对路径以包的起始目录为开头
特别需要注意的是:可以用import导入内置或者第三方模块(已经在sys.path中),但是要绝对避免使用import来导入自定义包的子模块(没有在sys.path中),应该使用from... import ...的绝对或者相对导入,且包的相对导入只能用from的形式。
常用模块hashlib &logging
Module: hashlib
Import hashlib md = hashlib.md5() md.update(bytes(str,encoding=‘utf-8‘)) 输入值1 md.update(bytes(str,encoding=‘utf-8‘)) 输入值2 cmd = md.hexdigest() 生成md5值
用来验证和储存密码!或者用SHA1方法
Import logging
import logging
在脚本内只输出到屏幕或者文件可以用一下方法:
logging.basicConfig(level=logging.DEBUG, format=‘%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s‘, datefmt=‘%a, %d %b %Y %H:%M:%S‘, filename=‘/tmp/test.log‘, filemode=‘w‘) logging.debug(‘debug message‘) logging.info(‘info message‘) logging.warning(‘warning message‘) logging.error(‘error message‘) logging.critical(‘critical message‘)
参数配置
logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有: filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。 filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。 format:指定handler使用的日志显示格式。 datefmt:指定日期时间格式。 level:设置rootlogger(后边会讲解具体概念)的日志级别 stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。 format参数中可能用到的格式化串: %(name)s Logger的名字 %(levelno)s 数字形式的日志级别 %(levelname)s 文本形式的日志级别 %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有 %(filename)s 调用日志输出函数的模块的文件名 %(module)s 调用日志输出函数的模块名 %(funcName)s 调用日志输出函数的函数名 %(lineno)d 调用日志输出函数的语句所在的代码行 %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示 %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数 %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒 %(thread)d 线程ID。可能没有 %(threadName)s 线程名。可能没有 %(process)d 进程ID。可能没有 %(message)s用户输出的消息
或者用如下方法 既输入到屏幕又输入到文件
import logging logger = logging.getLogger() # 创建一个handler,用于写入日志文件 fh = logging.FileHandler(‘test.log‘) # 再创建一个handler,用于输出到控制台 ch = logging.StreamHandler() formatter = logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘) fh.setFormatter(formatter) ch.setFormatter(formatter) logger.addHandler(fh) #logger对象可以添加多个fh和ch对象 logger.addHandler(ch) logger.debug(‘logger debug message‘) logger.info(‘logger info message‘) logger.warning(‘logger warning message‘) logger.error(‘logger error message‘) logger.critical(‘logger critical message‘)