鱼C论坛

 找回密码
 立即注册
查看: 2176|回复: 3

要怎么理解property的装饰器?

[复制链接]
发表于 2023-8-27 11:27:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1693106601566.jpg
要怎么理解property的装饰器?
property返回3个方法给x,那么x里面就有了gettrt,settrt,deleter,然后@x.setter ,这个就理解不了了 ,@x.setter是不是等于x=x.setter(x)?这个传入的参数给谁接收?setter的参数和内部是什么样子的? 求大佬代代我

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-27 11:27:55 | 显示全部楼层
@property 是 Python 中用作装饰器的一个内置函数,它可以将一个方法转换为属性。

当一个方法被 @property 装饰后,它将被视为一个只读属性。这意味着在访问该方法时,不需要使用括号,就像访问属性一样。

@property 装饰器返回了一个包装器对象,该对象具有 getter、setter 和 deleter 方法,用于处理属性的获取、设置和删除操作。通过使用 @x.setter 装饰器,可以定义一个对属性进行设置操作的方法。

例如,假设我们有一个名为 x 的类,并希望将其作为属性来访问。我们可以使用 @property 装饰器将一个方法转换为属性的 getter 方法,然后使用 @x.setter 装饰器创建一个 setter 方法,以便在给属性赋值时触发。

下面是一个示例:
class Example:
    def __init__(self):
        self._x = 0

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

在上述代码中,@property 装饰器将 x() 方法转换为属性的 getter 方法。而 @x.setter 装饰器则定义了一个与属性名相同的 setter 方法。

当我们使用 @x.setter 装饰器后,它等效于调用 x = x.setter(x)。这样,我们可以在 x 对象上调用 .setter() 方法,并将原始的 x() 方法作为参数传递给 .setter() 方法。

setter 方法允许我们在对属性进行赋值时执行一些操作,例如验证输入值的有效性或更新其他相关的属性。

希望这能帮助您理解 @property 装饰器以及它与 @x.setter 的关系。如有进一步问题,请随时追问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-27 11:28:59 | 显示全部楼层
@property装饰器是Python中用于定义属性的一种方式。它可以将一个方法转化为一个只读属性、可写属性或可删除属性。当我们使用@property装饰器时,它会将方法转换为一个属性,并提供了getter、setter和deleter方法。

当我们使用@property装饰器时,它会将一个方法转换为只读属性。例如,假设我们有一个名为x的属性,我们可以使用@property装饰器来定义一个getter方法,如下所示:
class MyClass:
    def __init__(self):
        self._x = 0

    @property
    def x(self):
        return self._x

在上面的例子中,我们定义了一个名为x的只读属性。通过使用@property装饰器,我们可以通过调用实例的x属性来获取_x的值。例如:
my_obj = MyClass()
print(my_obj.x)  # 输出: 0

如果我们希望x属性可写,我们可以使用@property装饰器定义一个setter方法。例如:
class MyClass:
    def __init__(self):
        self._x = 0

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

在上面的例子中,我们定义了一个可写属性x。通过使用@property装饰器和对应的setter方法,我们可以设置_x的值。例如:
my_obj = MyClass()
my_obj.x = 10
print(my_obj.x)  # 输出: 10

当我们使用@x.setter装饰器时,它实际上是将x.setter方法赋值给x属性。因此,@x.setter等价于x = x.setter(x)。在这里,传入的参数value将接收我们设置属性时传入的值。

使用@property装饰器的另一个常见用途是定义可删除属性。我们可以使用@x.deleter装饰器来定义一个deleter方法,如下所示:
class MyClass:
    def __init__(self):
        self._x = 0

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

    @x.deleter
    def x(self):
        del self._x

在上面的例子中,我们定义了一个可删除属性x。通过使用@x.deleter装饰器和对应的deleter方法,我们可以删除_x的值。例如:
my_obj = MyClass()
del my_obj.x
print(my_obj.x)  # 抛出AttributeError: 'MyClass' object has no attribute '_x'

总结一下,@property装饰器可以将一个方法转换为只读属性、可写属性或可删除属性。通过使用对应的装饰器(@x.setter或@x.deleter),我们可以定义setter和deleter方法,以提供属性的写入和删除功能。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-27 11:43:30 | 显示全部楼层
陶远航 发表于 2023-8-27 11:27
@property 是 Python 中用作装饰器的一个内置函数,它可以将一个方法转换为属性。

当一个方法被 @proper ...

当我们使用 @x.setter 装饰器后,它等效于调用 x = x.setter(x)。这样,我们可以在 x 对象上调用 .setter() 方法,并将原始的 x() 方法作为参数传递给 .setter() 方法。 这个我可以理解成重写吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 22:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表