为什么self.email和self._email总是在@property下面的python类中彼此相等?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么self.email和self._email总是在@property下面的python类中彼此相等?相关的知识,希望对你有一定的参考价值。

我从这个博客中得到了一个关于@property用法的例子:https://tomayko.com/blog/2005/getters-setters-fuxors。运行下面的文章代码后,我注意到self.email和self._email是平等的,不知道为什么?

class Contact(object):
    def __init__(self, first_name=None, last_name=None,
                 display_name=None, email=None):
        self.first_name = first_name
        self.last_name = last_name
        self.display_name = display_name
        self.email = email  #1 here the variable name is "email"

    def print_info(self):
        print self.display_name, "<" + self.email + ">"

    def set_email(self, value):
        if '@' not in value:
            raise Exception("This doesn't look like an email address.")
        self._email = value #2 here the name is "_email" with a leading underscore

    def get_email(self):
        return self._email #3 here with a leading underscore too

    email = property(get_email, set_email) #4 the name is "email" without underscore
C = Contact('a','b','c','d@email.com')
print C.email
C.email = 'e@emailcom'
print C.email

通过逐步执行代码,我注意到这两个变量总是相同的。这怎么发生的?我想知道它背后的功能是什么并支持它。

答案

我不知道你想要做什么,但变量_setemail被提到两次,但它们都没有提到你的输出。还要查看可能有助于您了解程序优先级的LEGB规则。

以上是关于为什么self.email和self._email总是在@property下面的python类中彼此相等?的主要内容,如果未能解决你的问题,请参考以下文章

marshmallow关系处理

将 ValidationError 提升为字典时出错

如何将 python 类型注释添加到烧瓶全局上下文 g?

如何调用回调?

python面向对象

day7