__dict__ 用于未显示 @property 属性的对象

Posted

技术标签:

【中文标题】__dict__ 用于未显示 @property 属性的对象【英文标题】:__dict__ for an object not showing @property attribute 【发布时间】:2021-03-23 21:29:57 【问题描述】:

当使用装饰器时,我通过“setter”装饰器设置一个属性,但是它没有显示在对象的 dict 中。 下面是我的代码

class Employee:
    def __init__(self, first, last):
        self.f_name = first
        self.l_name = last
        self.email = self.f_name + '.' + self.l_name + '@hotmail.com'
    
    @property
    def fullname(self):
        return (' '.format(self.f_name,self.l_name) )


    @fullname.setter
    def fullname(self, name):
        first, last = name.split(' ')
        self.f_name = first
        self.l_name = last
        self.email = self.f_name + '.' + self.l_name + '@hotmail.com'
        
emp_1 = Employee('Sandeep', 'Behera')
print(emp_1.__dict__)


emp_1.fullname = "Alex Smith"
print(emp_1.__dict__)

emp_1.age = 20
print(emp_1.__dict__)

上面运行,结果是:

'f_name': 'Sandeep', 'l_name': 'Behera', 'email': 'Sandeep.Behera@hotmail.com'
'f_name': 'Alex', 'l_name': 'Smith', 'email': 'Alex.Smith@hotmail.com'
'f_name': 'Alex', 'l_name': 'Smith', 'email': 'Alex.Smith@hotmail.com', 'age': 20

为什么即使我正在分配“全名”也没有出现在字典中

emp_1.fullname = "Alex Smith"

但它显示“年龄”属性。它是否与装饰器有关? 提前致谢。

【问题讨论】:

为什么“全名”在我分配时也没有出现在 Dict 中?__init__ 没有出现在 @987654325 中的原因相同@。这是你班级的方法。它只是用@property 装饰,使它看起来像一个属性,但它不是一个属性。 【参考方案1】:

您的装饰设置器没有创建属性fullname。 如下向您的设置器添加新行将为您提供属性full_name

@fullname.setter
def fullname(self, name):
    first, last = name.split(' ')
    self.f_name = first
    self.l_name = last
    self.email = self.f_name + '.' + self.l_name + '@hotmail.com'
    self.full_name = name      # creating an attribute full_name

结果如下:

'f_name': 'Sandeep', 'l_name': 'Behera', 'email': 'Sandeep.Behera@hotmail.com'
'f_name': 'Alex', 'l_name': 'Smith', 'email': 'Alex.Smith@hotmail.com', 'full_name': 'Alex Smith'
'f_name': 'Alex', 'l_name': 'Smith', 'email': 'Alex.Smith@hotmail.com', 'full_name': 'Alex Smith', 'age': 20

【讨论】:

以上是关于__dict__ 用于未显示 @property 属性的对象的主要内容,如果未能解决你的问题,请参考以下文章

如何访问 Python 超类的属性,例如通过 __class__.__dict__?

python的dir()和__dict__属性的区别

python实例属性的显示方法-dir__dict__

python的dir()和__dict__属性的区别

python - 自定制property/property的延时计算

python 学习 有序字典