"Pythonic"方式"重置"一个对象的变量?

16 python variables global local

("变量"在这里指的是"名称",我认为,不完全确定pythonistas使用的定义)

我有一个对象和一些方法.这些方法都需要并且都会更改对象的变量.我怎样才能在最苛刻和最好的方面尊重OOP技术,实现方法所使用的对象变量,同时保留其他方法的原始值?

我应该在每次调用方法时复制对象吗?我应该保存原始值并使用reset()方法在每次方法需要时重置它们吗?还是有更好的方法?

编辑:我被要求伪代码.由于我更感兴趣的是理解这个概念,而不仅仅是专门解决我遇到的问题,我将试着举个例子:

class Player():
    games = 0
    points = 0
    fouls = 0
    rebounds = 0
    assists = 0
    turnovers = 0
    steals = 0

    def playCupGame(self):
        # simulates a game and then assigns values to the variables, accordingly
        self.points = K #just an example

    def playLeagueGame(self):
        # simulates a game and then assigns values to the variables, accordingly
        self.points = Z #just an example
        self.rebounds = W #example again

    def playTrainingGame(self):
        # simulates a game and then assigns values to the variables, accordingly
        self.points = X #just an example
        self.rebounds = Y #example again
Run Code Online (Sandbox Code Playgroud)

以上是我的Player对象类(例如假设他是篮球对象).该对象有三种不同的方法,它们都为玩家的统计数据赋值.

所以,假设球队有两场联赛,然后是杯赛.我必须打这些电话:

p.playLeagueGame()
p.playLeagueGame()
p.playCupGame()
Run Code Online (Sandbox Code Playgroud)

很明显,当进行第二次和第三次调用时,需要重置先前更改的玩家统计数据.为此,我可以编写一个重置方法,将所有变量设置为0,或者为每次调用复制对象.或做一些完全不同的事情.

这就是我的问题所在,最好的方法是什么,python和oop明智吗?

更新:我怀疑我已经超级复杂了,我可以通过在函数中使用局部变量轻松解决我的问题.但是,如果我在另一个函数中有一个函数会发生什么,我可以在内部函数中使用外部函数的局部变量吗?

Pao*_*tor 8

不确定它是否足够"Pythonic",但你可以为该__init__方法定义一个"可重置"装饰器,该方法创建一个副本,__dict__并添加一个reset()将当前切换__dict__到原始方法的方法.

编辑 - 这是一个示例实现:

def resettable(f):
    import copy

    def __init_and_copy__(self, *args, **kwargs):
        f(self, *args)
        self.__original_dict__ = copy.deepcopy(self.__dict__)

        def reset(o = self):
            o.__dict__ = o.__original_dict__

        self.reset = reset

    return __init_and_copy__

class Point(object):
    @resettable
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        return "%d %d" % (self.x, self.y)

class LabeledPoint(Point):
    @resettable
    def __init__(self, x, y, label):
        self.x = x
        self.y = y
        self.label = label

    def __str__(self):
        return "%d %d (%s)" % (self.x, self.y, self.label)

p = Point(1, 2)

print p # 1 2

p.x = 15
p.y = 25

print p # 15 25

p.reset()

print p # 1 2

p2 = LabeledPoint(1, 2, "Test")

print p2 # 1 2 (Test)

p2.x = 3
p2.label = "Test2"

print p2 # 3 2 (Test2)

p2.reset()

print p2 # 1 2 (Test)
Run Code Online (Sandbox Code Playgroud)

Edit2:添加了一个带继承的测试

  • 在Python中,它们被称为装饰器,而不是注释 (2认同)

Bry*_*ley 7

我不确定"pythonic",但为什么不在reset你的对象中创建一个方法来完成所需的重置?将此方法称为您的一部分,__init__因此您不会复制数据(即:始终(重新)在一个位置初始化它 - reset方法)