zoukankan      html  css  js  c++  java
  • 03.6 私有属性,上下文管理器

    代码

    # ============================
    # 数据封装
    class User:
        def __init__(self, number):
            """__属性名,私有属性"""
            self.__number = number
            print("User init")
    
        def get_number(self):
            return self.__number
    
    
    # super调用
    class Man(User):
        def __init__(self):
            print("Man __init__")
    
            # super调用父类的构造方法, 执行顺序 遵循mro
            super().__init__(2)
    
    
    # mixin - drf 模式特点
    """
    1. 功能单一
    2. 不和基类关联,可以和任意基类组合,基类可以不和mixin关联就能初始化成功
    3. 在mixin中不要使用super这种方法
    """
    
    # with 语句 上下文管理器, 类中定义__enter__,__exit__ 即可使用with是实现上下文管理
    class Sample:
        def __enter__(self):
            """获取资源"""
            return self
        def __exit__(self, exc_type, exc_val, exc_tb):
            """释放资源"""
            print("exit")
        def do_something(self):
            print("doing something")
    
    
    with Sample() as sample:
        sample.do_something()
    
    # contextlib 简化上下文管理器
    import contextlib
    @contextlib.contextmanager
    def file_open(file_name):
        # 相当于 __enter__
        print("file open")
        yield print(file_name)
        # 相当于 __exit__
        print("file end")
    
    with file_open("123") as f:
        f
    
    if __name__ == '__main__':
        user = User(1)
        # print(user.__number)    # AttributeError: 'User' object has no attribute '__number'
    
        # 对象自省机制
        # 查看类/实例中的属性 __dict__. -返回字典
        print(user.__dict__)
        print(User.__dict__)
        # dir查看 所有属性(不包含值) - 返回列表
        print(dir(user))
    
        #
        print(Man.__mro__)  # (<class '__main__.Man'>, <class '__main__.User'>, <class 'object'>)
        man = Man()
    
    
  • 相关阅读:
    javascript 获取鼠标在盒子中的坐标
    jquery中clientY, pageY, screenY的区别,最后三张图一目了然
    javascript 小清新颜色翻页效果
    javascript 缓动返回顶部案例
    原生js轮播图实现
    javascript Math对象
    javascript 获取节点元素的封装
    javascript 转换大小写字母
    2017 ACM-ICPC 亚洲区(青岛赛区)网络赛 1010
    2017 ACM-ICPC 亚洲区(青岛赛区)网络赛 1009
  • 原文地址:https://www.cnblogs.com/zy7y/p/14193607.html
Copyright © 2011-2022 走看看