파이썬 노트 (23) (오 객체 지향 프로그램)

컨텐츠 오늘

  • 직장에서 축제

  • 싱글

    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. 프로젝트 디렉토리 구조

  • 스크립트

    표준 모듈 소개 : 짧은 상단 표면의 이름을, 가져 오기 모듈 후 제 3 자.

  • 단일 실행 파일

    import src.run import start
    if __name__=='__main__':
        start()

추천

출처www.cnblogs.com/cuiyongchao007/p/12363959.html