装饰器可在不修改原函数代码前提下动态扩展功能,支持带参数函数。类装饰器与内置装饰器(@staticmethod、@classmethod、@property)作用类似。模块引用使用import,可通过from...import部分导入或as起别名。__name__属性判断模块运行方式,dir()函数列出模块定义名称。
Python装饰器是一种在不修改原函数代码的前提下,为其动态扩展功能并返回新函数的技术手段。装饰器的核心逻辑清晰直接:它相当于为函数“穿上一层马甲”,实现功能增强的同时保持原始代码不变。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
通过一个基础示例来理解Python装饰器:定义一个装饰器,在原函数执行前后分别插入额外操作。
def my_decorator(func):
def wrapper():
print("在原函数之前执行")
func()
print("在原函数之后执行")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
# 在原函数之前执行
# Hello!
# 在原函数之后执行
Python装饰器同样支持带参数函数的扩展,关键在于包装函数能够接收任意参数。
def my_decorator(func):
def wrapper(*args, **kwargs):
print(f"在原函数之前执行, {args}")
func(*args, **kwargs)
print(f"在原函数之后执行, {args}")
return wrapper
@my_decorator
def greet(name):
print(f"Hello, {name}!")
greet("Alice")
# 在原函数之前执行, ('Alice',)
# Hello, Alice!
# 在原函数之后执行, ('Alice',)
需要特别说明:Python装饰器与继承机制有本质区别。装饰器属于“包装”操作,不修改原始函数代码;而继承是子类对父类的扩展,两者在Python编程中属于不同的技术路径。
Python类装饰器与函数装饰器的设计思路一致,区别在于它接收的是一个类对象,返回经过修改的新类。以下示例为类添加日志功能,在调用方法前后输出相关信息。
def log_class(cls):
"""类装饰器,在调用方法前后打印日志"""
class Wrapper:
def __init__(self, *args, **kwargs):
self.wrapped = cls(*args, **kwargs) # 实例化原始类
def __getattr__(self, name):
"""拦截未定义的属性访问,转发给原始类"""
return getattr(self.wrapped, name)
def display(self):
print(f"调用 {cls.__name__}.display() 前")
self.wrapped.display()
print(f"调用 {cls.__name__}.display() 后")
return Wrapper # 返回包装后的类
@log_class
class MyClass:
def display(self):
print("这是 MyClass 的 display 方法")
obj = MyClass()
obj.display()
# 调用 MyClass.display() 前
# 这是 MyClass 的 display 方法
# 调用 MyClass.display() 后
Python语言内置了多个实用装饰器,在Python日常开发中使用频率很高:
@staticmethod —— 将方法定义为静态方法,无需实例即可直接调用。@classmethod —— 定义类方法,第一个参数默认为类本身(通常命名为 cls)。@property —— 让方法以属性方式访问,并可配合 setter 实现访问控制。通过具体代码理解Python内置装饰器的使用方式:
class MyClass:
@staticmethod
def static_method():
print("这是一个静态方法!")
@classmethod
def class_method(cls):
print(f"这是一个类方法 {cls.__name__}.")
@property
def name(self):
return self._name
@name.setter
def name(self, value):
self._name = value
# 使用
MyClass.static_method()
MyClass.class_method()
obj = MyClass()
obj.name = "Alice"
print(obj.name)
Python支持多个装饰器叠加使用,按从上到下的顺序依次应用于目标函数。装饰器顺序影响执行效果,靠近函数的装饰器优先被包裹。
def decorator1(func):
def wrapper():
print("Decorator 1")
func()
return wrapper
def decorator2(func):
def wrapper():
print("Decorator 2")
func()
return wrapper
@decorator1
@decorator2
def say_hello():
print("Hello!")
say_hello()
Python通过 import 关键字实现模块引用。值得注意的是,无论代码中编写多少次import语句,同一个文件只会被导入一次,因为Python内部会进行缓存处理。
import supper
supper.test('123')
Python模块导入的查找路径顺序为:当前脚本目录 → PYTHONPATH → 标准库 → 第三方包(site-packages)。这一机制带来的实际问题是:项目中不应存在同名模块,否则会引发命名冲突。因此,在Python项目开发中,应避免为模块或库使用重复名称。
使用 from ... import 语法可以只导入模块中的指定部分,从而避免污染命名空间,这是Python推荐的引用方式。
from fibo import fib, fib2
fib(500)
# 1 1 2 3 5 8 13 21 34 55 89 144 233 377
利用 as 关键字可以为导入的模块或函数设置别名,使代码书写更加简洁:
import numpy as np # 将 numpy 模块别名设置为 np
from math import sqrt as square_root # 将 sqrt 函数别名设置为 square_root
from modname import * 语句可以将模块中所有公开成员一次性导入。但在Python实际开发中,这种做法容易引发命名冲突,因此通常不建议使用。
from modname import *
__name__ 属性编写Python模块时,常遇到需要区分脚本是直接运行还是被导入的场景。利用 __name__ 属性可以实现这一需求:直接运行时其值为 '__main__',被导入时则为当前模块名称。
if __name__ == '__main__':
print('程序自身在运行')
else:
print('我来自另一模块')
需要留意的是,__name__ 属性始终存在,只是在不同执行环境下取值不同。
Python内置函数 dir() 能够列出模块中定义的所有名称,涵盖变量、函数、类等元素,在调试过程中非常实用。
import fibo, sys
dir(fibo)
# ['__name__', 'fib', 'fib2']
dir(sys)
""" ['__displayhook__', '__doc__', '__excepthook__', '__loader__', '__name__', '__package__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe', '_home', '_mercurial', '_xoptions', 'abiflags', 'api_version', 'argv', 'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags', 'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettotalrefcount', 'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info', 'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout', 'thread_info', 'version', 'version_info', 'warnoptions'] """
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述