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明智吗?
更新:我怀疑我已经超级复杂了,我可以通过在函数中使用局部变量轻松解决我的问题.但是,如果我在另一个函数中有一个函数会发生什么,我可以在内部函数中使用外部函数的局部变量吗?
不确定它是否足够"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:添加了一个带继承的测试
我不确定"pythonic",但为什么不在reset
你的对象中创建一个方法来完成所需的重置?将此方法称为您的一部分,__init__
因此您不会复制数据(即:始终(重新)在一个位置初始化它 - reset
方法)
归档时间: |
|
查看次数: |
24470 次 |
最近记录: |