Python 类为每次执行的@property 提供不同的输出

Posted

技术标签:

【中文标题】Python 类为每次执行的@property 提供不同的输出【英文标题】:Python Class gives different Output for @property Executed Each Time 【发布时间】:2021-03-05 04:24:21 【问题描述】:

所以我使用带有@property 装饰器的 Python 类,但每次运行它的对象实例时都会给出不同的输出。

import random
generateID = lambda : random.randint(0, 99)

通过上面的函数,我创建了如下二类:

class A:
    name = generateID()

obj = A()
for _ in range(3):
    print(obj.name)

>> 79
>> 79
>> 79

class B:
    @property
    def name(self):
        return generateID()
    
obj = B()
for _ in range(3):
    print(obj.name)

>> 32
>> 94
>> 45

即使我使用random.seed,每次我仍然得到不同的结果。这是预期的行为吗?我不明白。请解释!

【问题讨论】:

你告诉它返回一个随机整数。它返回一个随机整数。您是否期望它将第一个值保存在某个地方? 当一个对象被创建时,它应该用一个随机整数初始化,并且从那时起它应该保持不变,对吧?就像在A.name 中一样,但是对于B.name,当我运行同一个对象时它是不同的。 “当一个对象被创建时,它应该用一个随机整数初始化”——这不是property 的意思。如果您希望在对象初始化时发生某些事情,请将其放入 __init__ property 代码发生在属性访问时。 【参考方案1】:

所以以前我在不知道python-decorators 的全部范围的情况下遇到了上述问题。因此,如果其他人像我一样被卡住,那么您可以在 YouTube 上查看本教程 - Corey Schafer 的“Python OOP Tutorial 6: Property Decorators - Getters, Setters, and Deleters”。

【讨论】:

以上是关于Python 类为每次执行的@property 提供不同的输出的主要内容,如果未能解决你的问题,请参考以下文章

Java枚举类型在RPC调用时由于版本不一致遇见的问题

三问JavaBean

Python的特性(property) (转)

继承 Python 的`property`

python9-类的装饰器(property, classmethod, staticmethod)

Python学习之旅---自定制property