gpt4 book ai didi

python - 了解应该绑定(bind)到对象实例的类范围变量

转载 作者:太空宇宙 更新时间:2023-11-04 07:20:14 24 4
gpt4 key购买 nike

这是一个为玩家分配符号的类。它应该接受一个 Action 并将该 Action 添加到玩家现有的 Action 库中。

class Player:
...: positions = []
...: def __init__(self,symbol):
...: self.symbol = symbol
...: def move(self,position):
...: self.position = position
...: self.positions.append(self.position)

我的问题是 positions 在不绑定(bind)到对象实例的意义上表现得“全局”,以证明:

>>>a = Player('x')
>>>b = Player('y')
>>>a.move(1)
>>>b.positions
[1]

最佳答案

当你说,

class Player:
positions = []

positions 将是一个类变量,该类的所有实例都使用同一个对象。你可以通过这个确认

player1, player2 = Player(), Player()
print player1.positions is player2.positions # True
print Player.positions is player1.positions # True

如果你想创建实例变量(为 Player 的每个实例创建单独的 positions 变量),你可以在 __init__ 中创建它功能。它是一个特殊的初始化函数,它获取当前的实际对象作为第一个参数。您可以创建 positions 变量并将其附加到该对象,如下所示

class Player:
def __init__(self):
self.positions = []

player1, player2 = Player(), Player()
print player1.positions is player2.positions # False

在这里,self 指的是新构造的对象,您正在通过 self.positions 在该对象中创建一个新变量,并且您正在通过一个空列表对其进行初始化

self.positions = []

因此,每当您创建 Player 的新实例时,self 将引用创建的新实例并创建新变量 positions在每个实例上,这意味着每个实例都有单独的 positions 变量。

无论何时调用move,您都不必在self 上创建新的position 变量。相反,你可以这样做

def move(self, position):
self.positions.append(position)

如果你使用的是 Python 2.x,最好使用新的样式类,就像这样

class Player(object):
def __init__(self):
self.positions = []

关于python - 了解应该绑定(bind)到对象实例的类范围变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21494982/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com