python中@修饰器

参考文章:python中@修饰符

代码示例如下

def test(func):
    func()

@test
def fun():
    print "call fun"

上面的代码会输出
call fun

@修饰符有点像函数指针,python解释器发现执行的时候如果碰到@修饰的函数,首先就解析它,找到它对应的函数进行调用,并且会把@修饰下面一行的函数作为一个函数指针传入它对应的函数。代码的解析流程如下:

1.python解释器发现@test,就去调用test函数

2.test函数调用预先要指定一个参数,传入的就是@test下面修饰的函数,也就是fun()

3.test()函数执行,调用fun(),fun()打印“call fun”

另一段代码

def test(func):
    func()
    print "call test over"

def main():
    @test
    def fun():
        print "call fun"

这样调用的话就不会调用test,只有当main函数调用的时候才会进入到main函数,然后调用test

### Python@property修饰器的工作原理 在Python中,`@property` 是一个内置的装饰器,用于实现类中的属性访问控制。通过使用 `@property`,可以将类的方法伪装成一个只读属性,从而使得方法调用更加简洁和直观[^1]。 具体来说,`@property` 的主要作用是将一个类的方法转换为只读属性。这样做的好处是可以隐藏对象内部的实现细节,同时提供一种更自然的方式来访问对象的状态。以下是 `@property` 的基本工作原理: #### 1. 只读属性 当一个方法被 `@property` 装饰后,它就可以像普通属性一样被访问,而无需显式地调用方法。例如: ```python class Person: def __init__(self, name): self._name = name @property def name(self): return self._name person = Person("Alice") print(person.name) # 输出: Alice ``` 在此示例中,`name` 方法被装饰为 `@property`,因此可以通过 `person.name` 直接访问,而不需要调用 `person.name()`[^1]。 #### 2. 设置和删除属性 除了定义只读属性外,`@property` 还支持通过 `@<property_name>.setter` 和 `@<property_name>.deleter` 来实现对属性的设置和删除功能。例如: ```python class Person: def __init__(self, name): self._name = name @property def name(self): return self._name @name.setter def name(self, value): if not isinstance(value, str): raise ValueError("Name must be a string.") self._name = value @name.deleter def name(self): del self._name person = Person("Alice") person.name = "Bob" # 使用 setter 修改属性值 print(person.name) # 输出: Bob del person.name # 使用 deleter 删除属性 ``` 上述代码中,`@name.setter` 定义了如何设置 `name` 属性的值,而 `@name.deleter` 定义了如何删除该属性[^3]。 #### 3. 内部机制 `@property` 实际上是一个描述符(descriptor),它通过重载 `__get__`、`__set__` 和 `__delete__` 方法来实现对属性的访问控制。描述符是一种特殊的类,用于管理其他类中属性的行为。以下是 `@property` 的简化实现: ```python class Property: def __init__(self, fget=None, fset=None, fdel=None): self.fget = fget self.fset = fset self.fdel = fdel def __get__(self, instance, owner): if instance is None: return self if self.fget is None: raise AttributeError("unreadable attribute") return self.fget(instance) def __set__(self, instance, value): if self.fset is None: raise AttributeError("can't set attribute") self.fset(instance, value) def __delete__(self, instance): if self.fdel is None: raise AttributeError("can't delete attribute") self.fdel(instance) ``` 通过这种机制,`@property` 能够拦截对属性的访问、修改和删除操作,并执行相应的逻辑[^4]。 ### 总结 `@property` 提供了一种优雅的方式,使方法看起来像普通的属性访问,同时保留了对属性访问的控制能力。这不仅提高了代码的可读性,还增强了数据封装的安全性[^5]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值