Python可以';t在非持久性属性上设置属性

Python可以';t在非持久性属性上设置属性,python,python-3.x,Python,Python 3.x,我想在模型上设置一个非持久性属性。我尝试了以下方法: class class User(models.Model): email = models.EmailField(max_length=254, unique=True, db_index=True) @property def client_id(self): return self.client_id 然后: 我得到错误:无法设置属性。为什么?您也需要为您的属性定义一个setter函数,现在,

我想在模型上设置一个非持久性属性。我尝试了以下方法:

class class User(models.Model):
    email = models.EmailField(max_length=254, unique=True, db_index=True)

    @property
    def client_id(self):
        return self.client_id
然后:


我得到错误:无法设置属性。为什么?

您也需要为您的属性定义一个setter函数,现在,它是只读的(例如,请参见问题)

请注意,我将
self.client\u id
重命名为
self.internal\u client\u id
,因为否则,您将递归调用getter和setter函数-内部变量的名称需要与属性的名称不同


当然,如果您需要使用
self.client\u id
(例如,由于继承),您也可以重命名属性本身。

我确实尝试过,但我得到了
最大递归深度超过了
,这是因为您的内部变量与属性同名,因此您可以递归调用setter。它应该,如果
self.\u client\u id
存在(不要忘了也更新setter),如果真的是这样,为什么还要费心编写这两个属性方法呢?为什么不简单地设置并获取该属性呢。代码没有实际效果。@BlackJack在这种情况下,是的。但是,与简单属性相比,属性确实具有某些优势(例如,允许您对值实施某些约束等)
user = User.objects.create(email='123', client_id=123)
print(user.client_id)
class class User(models.Model):
    email = models.EmailField(max_length=254, unique=True, db_index=True)

    @property
    def client_id(self):
        return self.internal_client_id

    @client_id.setter
    def client_id(self, value):
        self.internal_client_id = value