首页 > AI教程 >Python学习笔记3:核心知识点整理

Python学习笔记3:核心知识点整理

来源:互联网 2026-06-25 06:25:07

装饰器可在不修改原函数代码前提下动态扩展功能,支持带参数函数。类装饰器与内置装饰器(@staticmethod、@classmethod、@property)作用类似。模块引用使用import,可通过from...import部分导入或as起别名。__name__属性判断模块运行方式,dir()函数列出模块定义名称。

装饰器

Python装饰器是一种在不修改原函数代码的前提下,为其动态扩展功能并返回新函数的技术手段。装饰器的核心逻辑清晰直接:它相当于为函数“穿上一层马甲”,实现功能增强的同时保持原始代码不变。

Python学习笔记3:核心知识点整理

长期稳定更新的攒劲资源: >>>点此立即查看<<<

通过一个基础示例来理解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日常开发中使用频率很高:

  1. @staticmethod —— 将方法定义为静态方法,无需实例即可直接调用。
  2. @classmethod —— 定义类方法,第一个参数默认为类本身(通常命名为 cls)。
  3. @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__ 属性始终存在,只是在不同执行环境下取值不同。

dir方法

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'] """

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。