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

我最近了解了@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


繁星淼淼
浏览 86回答 2
2回答

慕勒3428872

我最近了解了@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

米脂

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 回调,并在检索/分配描述符时调用它们。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python