Skip to main content
 首页 » 编程设计

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

2025年05月04日12lvdongjie

这是一个为玩家分配符号的类。它应该接受一个 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 = []