gpt4 book ai didi

variables - "Pythonic"到 "reset"一个对象的变量?

转载 作者:太空狗 更新时间:2023-10-29 16:54:40 25 4
gpt4 key购买 nike

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

我有一个对象和一些方法。这些方法都需要并且都改变了对象的变量。我怎样才能在最 pythonic 和最好的情况下,尊重 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

上面是我的 Player 对象类(例如,假设他是一名篮球运动员)。该对象具有三种不同的方法,它们都为玩家的统计数据赋值。

那么,假设球队有两场联赛和一场杯赛。我必须调用这些电话:

p.playLeagueGame()
p.playLeagueGame()
p.playCupGame()

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

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

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

最佳答案

不确定它是否足够“Pythonic”,但您可以定义一个“可重置”装饰器对于创建对象的 __dict__ 副本的 __init__ 方法,并添加一个 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)

Edit2:添加了继承测试

关于variables - "Pythonic"到 "reset"一个对象的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4866587/

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