Python (四): @ (at)修饰符的理解

本文深入解析Python中的@装饰器,介绍其作为语法糖的基本概念,以及如何用作高级函数和回调函数来简化代码。通过具体实例展示装饰器在数据库操作和线程任务中的应用。
部署运行你感兴趣的模型镜像

@是什么

@是一个语法糖, 语法糖的意思是一种简便写法 (就好像 a++ 是 a = a + 1 的简便写法), 以下两种表达方式完全等价

def foo(fn):
	fn('hi')

# 写法一
@foo
def bar(something):
	print(something)

# 写法二
def bar(something):
	print(something)
bar = foo(bar)

所以@的作用是:

  1. 获得一个高级自定义函数
  2. 作为调用第三方函数的回调函数

下文对以上两点作解释.

理解

作为高级函数

以数据库场景为例, 我可以把数据库逻辑相关的函数提前写好

import pymysql

'''
	将数据库相关的逻辑提前写好
'''
def get_rows(callback):
	def _(*args):
		db = pymysql.connect('localhost', 'root', 'root', 'some_db')
		cursor = db.cursor()
		cursor.execute(args[0])
		rows = cursor.fetchall()
		db.close()
		return callback(rows=rows)
	return _

'''
	这里只需要写处理的逻辑
'''
@get_rows
def process_rows(sql=None, rows=None, fn = None):
	for row in rows:
		if fn is None:
			print(row)
		else:
			fn(row)

if __name__ == '__main__':
	process_rows(sql = 'select * from user')

作为回调函数

首先需要注意的是, @语法它相当于执行了

bar = foo(bar)

因此, 解释器在读到@命令以及其下方的函数定义之后, 会立即执行@的函数, 所以可以有如下用法:

def foo(callback):
    # 开启一个线程, 定时调用 callback
    # 以下语句无意义, 纯粹为了符合语法
    def _():
        pass
    return _ 

@foo
def bar():
	# do something...
    pass

这种用法的特点是, 你只需要声明这个 bar 函数, @语句会自动执行这个 foo 函数.

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我现在需要回答用户关于Python中以点号开头的属性和方法的问题。首先,用户提到“以点号开头的属性或方法”,这让我想到可能涉及私有成员或者特殊命名约定。根据之前的知识,Python中没有严格的私有变量,但通常使用下划线前缀来表示私有性。不过用户提到的是“点号开头”,可能有些混淆,因为点号通常用于访问对象的属性和方法,而不是作为名称的一部分。例如,obj.method()中的点号是访问操作符,而不是名称前缀。 接下来,我需要确认用户的具体问题。可能用户误解了点号的作用,或者想了解类似其他语言中的点号前缀(如CSS类选择器)。在Python中,属性和方法名称不会以点号开头,但可能用户看到的是某些框架或库的特殊用法,比如Django的模型查询中的双下划线语法,但这也不是以点号开头。 再查阅提供的引用内容,引用[3]提到Python的面向对象编程中,对象是核心,类定义了属性和方法。引用[1]中的__str__方法以双下划线开头和结尾,属于特殊方法。可能用户将双下划线(__)误认为是点号开头。或者,用户可能遇到某些库或框架中的特定语法,比如链式调用中的方法,但通常这些方法名也不以点号开头。 另一个可能性是用户指的是相对导入中的点号,例如from .module import something,这里的点号表示当前包,但这属于模块导入语法,而非属性或方法名。 综合来看,用户可能混淆了点号在访问对象成员时的作用与名称本身的约定。需要解释点号在Python中的用途,即用于访问对象的属性和方法,而名称本身的约定(如单下划线、双下划线)表示访问控制或特殊方法。同时,可能需要澄清Python中没有以点号开头的合法标识符,属性和方法名称不能以点号开头,但可能有其他上下文中的点号使用,如模块导入或装饰器语法。 此外,根据引用[1]中的例子,特殊方法如__str__以双下划线包围,这可能被用户误解为点号开头。需要指出这一点,并解释双下划线的作用,比如名称修饰(name mangling)和特殊方法定义。 总结回答的结构:首先解释点号在Python中的一般用途(访问对象成员),然后说明属性和方法命名的约定(单下划线、双下划线),澄清点号不是名称的一部分,而是访问操作符。接着,可能讨论相关概念,如私有变量、特殊方法、模块导入中的点号使用。最后,生成相关问题,帮助用户深入理解。</think>在Python中,以点号(`.`)连接的属性或方法属于**对象成员的访问语法**,而非名称本身包含点号。这种语法体现了面向对象编程中“对象.成员”的核心特性[^3]。以下是具体解析: --- ### 一、点号的作用 1. **访问对象属性** 通过`对象.属性名`直接访问类中定义的属性: ```python class Student: def __init__(self, name): self.name = name # 定义属性 stu = Student("Alice") print(stu.name) # 输出: Alice ``` 2. **调用对象方法** 通过`对象.方法名()`执行类中定义的方法: ```python class Calculator: def add(self, a, b): return a + b calc = Calculator() print(calc.add(3, 5)) # 输出: 8 ``` --- ### 二、名称前缀的约定 虽然Python不强制封装,但通过命名约定实现访问控制: 1. **单下划线前缀 `_`** 表示“内部使用”,但仍可直接访问(如`obj._internal_var`)[^3]。 2. **双下划线前缀 `__`** 触发名称修饰(Name Mangling),自动转换为`_类名__变量名`格式: ```python class MyClass: def __init__(self): self.__secret = 42 # 实际存储为 _MyClass__secret obj = MyClass() print(obj.__dict__) # 输出: {'_MyClass__secret': 42} ``` 3. **双下划线包围 `__method__`** 表示特殊方法(如`__str__`),由Python解释器自动调用[^1]: ```python class Time: def __str__(self): return "HH:MM:SS" # 定义对象的字符串表示 ``` --- ### 三、其他相关场景 1. **模块导入中的点号** 在包内使用相对导入时,点号表示当前包路径: ```python from .utils import helper_function # 从当前包导入 ``` 2. **链式方法调用** 某些库(如`pandas`)通过返回`self`实现链式调用: ```python df.head().describe().T # 连续调用多个方法 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值