Python 数据 类。不能将参数用作列表中的元素
Python data classes. Can't use arguments as elements in list
所以我在寻找类似 C 系列结构的东西后偶然发现了 python 数据 类。只是我不明白为什么你不能做这样的事情:
@dataclass
class Player:
gridx: float
gridy: float
rotation: float
pos = [gridx, gridy]
player = Player(2.5, 5.5, PI)
它说 gridx
没有定义。也许我只是理解错误的结构,你甚至不能用像 C 这样的语言来做到这一点。我认为它只是类似于正常 python 类 中的 __init__
方法,你在哪里几乎可以为所欲为。
from dataclasses import dataclass
from math import pi
@dataclass
class Player:
gridx: float
gridy: float
rotation: float
@property
def pos(self):
return [self.gridx, self.gridy]
player = Player(2.5, 5.5, pi)
print(player.pos)
输出
[2.5, 5.5]
是否允许设置 pos
以更改 gridx
和 gridy
(即 @pos.setter
)
,这取决于您
数据类 或多或少让写这个更容易:
class Player:
def __init__(self, gridx, gridy, rotation):
self.gridx = gridx
self.gridy = gridy
self.rotation = rotation
不要一直重复自己。我假设在您编写数据函数时 gridx 和 gridy 尚未定义。虽然你可以做的是使用 post_init 函数来处理:
@dataclass
class Player:
gridx: float
gridy: float
rotation: float
def __post_init__(self):
self.pos = [self.gridx, self.gridy]
player = Player(2.5, 5.5, math.pi)
print(player.pos)
顾名思义,它是一个应用的函数post(之后)数据类已按上述方式重写。
所以我在寻找类似 C 系列结构的东西后偶然发现了 python 数据 类。只是我不明白为什么你不能做这样的事情:
@dataclass
class Player:
gridx: float
gridy: float
rotation: float
pos = [gridx, gridy]
player = Player(2.5, 5.5, PI)
它说 gridx
没有定义。也许我只是理解错误的结构,你甚至不能用像 C 这样的语言来做到这一点。我认为它只是类似于正常 python 类 中的 __init__
方法,你在哪里几乎可以为所欲为。
from dataclasses import dataclass
from math import pi
@dataclass
class Player:
gridx: float
gridy: float
rotation: float
@property
def pos(self):
return [self.gridx, self.gridy]
player = Player(2.5, 5.5, pi)
print(player.pos)
输出
[2.5, 5.5]
是否允许设置 pos
以更改 gridx
和 gridy
(即 @pos.setter
)
数据类 或多或少让写这个更容易:
class Player:
def __init__(self, gridx, gridy, rotation):
self.gridx = gridx
self.gridy = gridy
self.rotation = rotation
不要一直重复自己。我假设在您编写数据函数时 gridx 和 gridy 尚未定义。虽然你可以做的是使用 post_init 函数来处理:
@dataclass
class Player:
gridx: float
gridy: float
rotation: float
def __post_init__(self):
self.pos = [self.gridx, self.gridy]
player = Player(2.5, 5.5, math.pi)
print(player.pos)
顾名思义,它是一个应用的函数post(之后)数据类已按上述方式重写。