代码
# ============================
# 数据封装
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()