为了账号安全,请及时绑定邮箱和手机立即绑定

难以理解@property 如何知道哪个变量是属性?

难以理解@property 如何知道哪个变量是属性?

繁星淼淼 2022-07-12 16:13:07
我最近了解了@property 装饰器,但(至少)有一件事我还不了解。在下面的这个类中,my_name 显然是属性名称,但根本不清楚该值是如何实际分配的。唯一的赋值是给带下划线的 _my_name 变量,但是装饰器怎么知道 self._my_name 对应于 my_name 属性呢?class Person:    def __init__(self, input_name):        self._my_name = input_name    @property    def my_name(self):        return self._my_name    @my_name.setter    def my_name(self, value):        self._my_name = value
查看完整描述

2 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

我最近了解了@property 装饰器,但(至少)有一件事我还不了解。在下面的这个类中,my_name 显然是属性名称,但根本不清楚该值是如何实际分配的。唯一的赋值是给带下划线的 _my_name 变量,但是装饰器怎么知道 self._my_name 对应于 my_name 属性呢?


class Person:

    def __init__(self, input_name):

        self._my_name = input_name


    @property

    def my_name(self):

        return self._my_name


    @my_name.setter

    def my_name(self, value):

        self._my_name = value


查看完整回答
反对 回复 2022-07-12
?
米脂

TA贡献1836条经验 获得超3个赞

Aproperty是一个描述符。它知道从哪里获取和设置_my_name,因为这是您的 getter 和 setter 方法告诉它获取和设置的内容。下面是一个描述符如何在内部工作的简单示例:


class MyProperty:

    def __init__(self, name):

        # The name of the property we are wrapping

        self.name = name


    def __get__(self, instance, owner):


        # Property was requested from the class, not an instance

        if instance is None:

            return self


        return getattr(instance, self.name)


    def __set__(self, instance, value):


        # Don't overwrite ourself...

        if instance is None:

            return


        setattr(instance, self.name, value)



class Person:

    def __init__(self, input_name):

        self._my_name = input_name


    # Define my_name, that will get/set _my_name

    my_name = MyProperty('_my_name')


jack = Person('Jack')

print(jack.my_name)

jack.my_name = 'Jane'

print(jack.my_name)

该属性以类似的方式工作,它记住其定义的 getter、setter 和 deleter 回调,并在检索/分配描述符时调用它们。


查看完整回答
反对 回复 2022-07-12
  • 2 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信