为什么我需要括号来访问 python 中的 Solidity 合约变量?

Why do I need parenthesis to access a Solidity contract variable in python?

在 Solidity 合约中有如下声明:

contract Lottery is VRFConsumerBase, Ownable {
address payable[] public players;
...
...

在同一合同的其他地方,有一个分配如下:

....
....
recentWinner = players[someIndex];
....
....

} 

deploy.pyPython脚本用于部署合约。部署合约的函数是:

def deploy_lottery():
      Lottery.deploy(....)
....
....

部署并执行其他操作后...合同的 recentWinner 变量可从 python 脚本使用括号访问,如下所示:

def end_lottery():
      print(f"{lottery.recentWinner()} is the winner!")
  

我的基本问题是,为什么要使用括号? recentWinner 不是 Lottery 合约中定义的函数。如果我 运行 没有 pa运行thesis 的脚本,我会得到以下输出。

<ContractCall 'recentWinner()'> is the winner!
Terminating local RPC client...

所以 pa运行 论文似乎是必要的。有人可以解释一下发生了什么吗?为什么我要把这个变量当作一个函数来检索它的值?如果您还可以向我指出一些相关的 posts/reading material 将不胜感激。谢谢!

EVM 没有 public 个变量,只有 public 个访问函数。

在幕后,Solidity 编译器会为您生成一个名为 recentWinner() 的函数。 This is called accessor or getter function。与 Java 等语言不同,函数没有 get 前缀。