今日のコンテンツ
仕事上の祭り
シングルトン
class Foo: pass obj1 = Foo() # 实例,对象 obj2 = Foo() # 实例,对象
ログモジュール(ログ)
プログラムのディレクトリ構造
要約&ジョブ
1.文字列フォーマット
msg = "我是%s,年龄%s" %('alex',19,)
print(msg)
msg = "我是%(n1)s,年龄%(n2)s" % {'n1': 'alex', 'n2': 123, }
print(msg)
# v1 = "我是{0},年龄{1}".format('alex',19)
v1 = "我是{0},年龄{1}".format(*('alex',19,))
print(v1)
# v2 = "我是{name},年龄{age}".format(name='alex',age=18)
v2 = "我是{name},年龄{age}".format(**{'name':'alex','age':18})
print(v2)
2.注文した辞書
from collections import OrderedDict
info = OrderedDict()
info['k1'] = 123
info['k2'] = 456
print(info.keys())
print(info.values())
print(info.items())
3.仕事
3.1スタックとキュー
class Stack(object):
pass
class Queue(object):
pass
3.2反射
class Cloud(object):
def upload(self):
pass
def download(self):
pass
def run(self):
# up|C:/xxx/xxx.zip
# down|xxxx.py
value = input('请用户输入要干什么?')
action = value.split('|')[0]
# 最low的形式
if action == 'up':
self.upload()
elif action == 'down':
self.download()
else:
print('输入错误')
# 构造字典 (*)
method_dict = {'up':self.upload, 'down':self.download}
method = method_dict.get(action)
method()
# 反射(*)
method = getattr(self,action) # upload # self.upload
method()
彼は加えました:
class Foo(object):
def get(self):
pass
obj = Foo()
# if hasattr(obj,'post'):
# getattr(obj,'post')
v1 = getattr(obj,'get',None) # 推荐
print(v1)
3.3サイクル削除要素:
表面は、リストの後ろから削除され、あなたは通常、削除することができます。
あなたがリストの先頭から削除すると、前方に、その後の削除エラーになります駅の背後にある要素のそれぞれを削除します。
コンテンツ詳細
例1シングルモード(23のデザインパターン)
インスタンス化された回数に関係なく、常にそれは、オブジェクトの最初のインスタンスで使用されています。
class Foo:
pass
# 多例,每实例化一次就创建一个新的对象。
obj1 = Foo() # 实例,对象
obj2 = Foo() # 实例,对象
# 单例,无论实例化多少次,都用第一次创建的那个对象。
obj1 = Foo()
obj2 = Foo()
標準的なシングルトンパターン
class Singleton(object):
instance = None
def __new__(cls, *args, **kwargs):
if not cls.instance:
cls.instance = object.__new__(cls)
return cls.instance
obj1 = Singleton()
obj2 = Singleton()
# 不是最终,加锁。
ファイル接続プール
class FileHelper(object):
instance = None
def __init__(self, path):
self.file_object = open(path,mode='r',encoding='utf-8')
def __new__(cls, *args, **kwargs):
if not cls.instance:
cls.instance = object.__new__(cls)
return cls.instance
obj1 = FileHelper('x')
obj2 = FileHelper('x')
====
class Foo(object):
instance = None
def __init__(self, path):
with open(path, mode='w', encoding='utf-8') as self.f1:
self.f1.write('zlex')
def __new__(cls, *args, **kwargs):
if not cls.instance:
cls.instance = object.__new__(cls)
return cls.instance
obj1 = Foo('alex.txt')
obj2 = Foo('alex.txt')
print(obj1, obj2)
2.インポートモジュール
複数の輸入リロード
import jd # 第一次加载:会加载一遍jd中所有的内容。 import jd # 由已经加载过,就不在加载。 print(456)
import importlib import jd importlib.reload(jd)#主动重新加载 print(456)
モジュールの特性によって導入もシングルトン実装されてもよいです。
# jd.py
class Foo(object):
pass
obj = Foo()
# app.py
import jd # 加载jd.py,加载最后会实例化一个Foo对象并赋值给obj
print(jd.obj)
3.ログ(モジュールロギング)
基本的なアプリケーション
ログ処理エッセンス:ロガー/ FileHandlerの/フォーマッタ
推奨される処理ログモード
import logging file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf-8',) logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p', handlers=[file_handler,], level=logging.ERROR ) logging.error('你好') #多次配置是无效的,只有第一次生效。
推奨されるログの分割処理ログモード+
import time import logging from logging import handlers # file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf-8',) file_handler = handlers.TimedRotatingFileHandler(filename='x3.log', when='s', interval=5, encoding='utf-8') logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p', handlers=[file_handler,], level=logging.ERROR ) for i in range(1,100000): time.sleep(1) logging.error(str(i))
注意事項:
# 在应用日志时,如果想要保留异常的堆栈信息。 import logging import requests logging.basicConfig( filename='wf.log', format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p', level=logging.ERROR ) try: requests.get('http://www.xxx.com') except Exception as e: msg = str(e) # 调用e.__str__方法 logging.error(msg,exc_info=True)
4.プロジェクトのディレクトリ構造
スクリプト
標準モジュールの紹介:名前短い上面を、インポートモジュールの後に第三者が。
単一の実行可能ファイル
import src.run import start if __name__=='__main__': start()