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()

原文地址:https://www.cnblogs.com/zy7y/p/14193607.html