assert断言
判断代码是否符合预期,后接一个逻辑表达式,若结果为非则报错,一般用于单元测试
自定义异常
# 创建一个自定义异常类
class CustomError(Exception):
def __init__(self, message="This is a custom exception."):
self.message = message
super().__init__(self.message)
del
语句用于删除对象的引用,这可能导致对象被垃圾回收
@property注解
将一个方法转化为一个只读属性(但可以定义属性的setter方法),提供方法类似属性的访问方式,允许在获取或修改属性值时执行一些逻辑
class MyClass:
def __init__(self, value: int):
self._value = value
@property
def value(self) -> int:
"""get the value of this class"""
return self._value
@value.setter
def value(self, new_value: int) -> None:
"""et the value of this class"""
if new_value < 0:
raise ValueError("Value must be greater than 0")
self._value = new_value
@value.deleter
def value(self) -> None:
"""delete the value of this class"""
print("deleting value" + "--" * 10)
del self._value
Python反射
反射指 运行时检查访问和修改对象的能力,py提供内置方法提供相关功能使得我们可以通过字符串形式引用对象的属性方法以及类的信息
class Myclass:
def __init__(self):
self.x = 42
def myfunction(self):
pass
obj = Myclass()
getattr(obj, "x", None)
hasattr(obj, "x")
setattr(obj, "x", 10)
delattr(obj, "x")
print(obj.__dict__) # 返回该实例的变量字典,不包含类的命令的空间
print(dir(obj)) # 列出对象的属性方法,包括继承的属性和全局命名空间,实质是调用了下面的方法
print(obj.__dir__()) # 可以被重写以提供自定义的目录信息
类的命名空间和全局命名空间
类:类变量、类方法、类属性
全局:所有模块共享,全局变量、函数
类定义体
class Myclass: print("yes") def __init__(self): print("__init__ called") print("no")
对于直接放置在类定义体内部而不是任何方法中的类定义语句,解释器都将会执行,其次在创建实例时才执行init方法。但大多数情况下初始化工作都应该放在init方法中
动态加载模块
根据配置加载不同模块或者按需加载
# 方案一
import importlib
sample_model = importlib.import_model(module_name)
#方案二
sample_model = __import__(model_name)
# 方案三
import importlib.machinery
loader = importlib.machinery.SourceFileLoader(module_name, "/path/to/math.py")
math_module = loader.load_module()