python 的奇怪行为``@property```

问题描述 投票:0回答:1

我有一个类,它是一组单词:

import math
from typing import Self

FREQUENCIES: dict[str, float] = {}
FREQUENCIES['trial'] = 0.023
FREQUENCIES['raise'] = 0.124

def entropy(probability: float) -> float:
  if probability == 0.0: return 0.0
  return -probability*math.log(probability)/math.log(2.0)

class Word(str):
  def __new__(cls, value: str = 'aaaaa') -> Self:
    value = value.strip().lower()
    if not re.match(r'[a-z]{5}', value): raise ValueError(f'"{value}" does not follow the pattern [a-z]{5}!')
    return super().__new__(cls, value)
  def __init__(self, value: str = 'aaaaa') -> None:
    self.frequency = FREQUENCIES[value]

class Universe(set[Word]):
  def __init__(self) -> None:
    super().__init__(set())
    self.frequency = 0.0
    self.statistics: dict[int, dict[str, float]] = {}
    self.updated = True
  def __iadd__(self, word: Word) -> Self:
    if word in self: return self
    self.updated = False
    self.add(word)
    return self
  @property
  def uncertainty(self) -> float:
    if not self.updated:
       self.frequency = sum(word.frequency for word in self)
       self.statistics = {i: {chr(letter): sum(wordle.frequency for wordle in self if wordle[i] == chr(letter)) for letter in range(ord('a'), ord('z')+1)} for i in range(len(Word()))}
       self.updated = True
    return sum(sum(entropy(letterFrequency/self.frequency) for letterFrequency in self.statistics[position].values()) for position in self.statistics) 

当我向其中添加(使用 +=)一个元素时,我确保制作了

self.updated
dirty

这是棘手的部分。 最初,我创建了

@property
来计算
Universe
的不确定性。

我想用这样的东西:

universe = Universe()
universe += Word('trial')
universe += Word('raise')
print(f'My universe has {len(universe)} words and an uncertainty of {universe.uncertainty} bits."

我似乎注意到的奇怪副作用是

self.updated
始终
True
(我可以在调试器窗口上看到它)!!!

如果我删除

@property
,代码的运行方式与我预期的完全一样(
self.updated
在我显式调用
True
后才变为
self.uncertainty()
)。

我在这里缺少什么?

解决方案 我正在使用 Visual Studio Code,当变量

universe
出现在调试器窗口上时,其
@property
self.uncertainty
在调试器上显示为 variable (显示其值)。这意味着 Visual Studio Code debugger 正在调用
@property
我调试的每一步,因此它将
self.updated
设置为
True
。 这也解释了为什么当我删除 @property 时,代码
“有效”
:调试器不会 NOT 自行调用
self.uncertainty()
(将
self.update
设置为
True

python properties
1个回答
0
投票

解决方案 我正在使用 Visual Studio Code,当变量

universe
出现在调试器窗口上时,其
@property
self.uncertainty
在调试器上显示为变量(显示其值)。这意味着 Visual Studio Code 调试器在调试的每一步都会调用
@property
,因此它将
self.updated
设置为
True
。这也解释了为什么当我删除
@property
时代码“有效”:调试器不会自行调用
self.uncertainty()
(将
self.update
设置为
True

© www.soinside.com 2019 - 2024. All rights reserved.