Python 处理在没有全局变量的函数之间使用的变量

Python 处理在没有全局变量的函数之间使用的变量,python,oop,encapsulation,Python,Oop,Encapsulation,所以我正在做一个基本的单词游戏,在游戏中,你会得到一个字母的“手”(字典对象),你可以用它来创建单词并获得分数 此“手”用于许多函数的参数:计算玩家分数、在玩家使用一个或多个字母后更新手中字母的数量、显示手、检查玩家单词的有效性等 从我所读到的所有内容中,我知道如果可以的话,我应该避免使用全局变量(尽管我仍然不能完全确定为什么) 那么,对于许多使用“手”作为参数的函数,我还可以使用什么样的通用方法呢 它被称为对象。创建具有共享状态的函数,以及共享该状态的函数 这比全局变量更好的原因是,它是同一概

所以我正在做一个基本的单词游戏,在游戏中,你会得到一个字母的“手”(字典对象),你可以用它来创建单词并获得分数

此“手”用于许多函数的参数:计算玩家分数、在玩家使用一个或多个字母后更新手中字母的数量、显示手、检查玩家单词的有效性等

从我所读到的所有内容中,我知道如果可以的话,我应该避免使用全局变量(尽管我仍然不能完全确定为什么)


那么,对于许多使用“手”作为参数的函数,我还可以使用什么样的通用方法呢

它被称为对象。创建具有共享状态的函数,以及共享该状态的函数

这比全局变量更好的原因是,它是同一概念的一个更受限制的版本-您可以清楚地看到哪些函数正在操作这些变量,并记录(并强制)这些变量上的预期不变量。对于全局变量,很容易得到对共享变量状态有不同期望的函数


它还允许您拥有同一对象的多个副本,因此您不必将变量强制转换为集合,并在集合成员之间进行关联,而是拥有一个对象集合,这使代码更简单。然后,只通过您定义的函数操作这些对象就很简单了。

使用类封装。。。见下文。。。游戏是双手都知道的

class Hand:
    def __init__(self):
       num_cards = 7
       self.cards = ["a" for i in range(num_cards)]

class Game:
    def __init__(self,num_hands=2):
        self.hands = [Hand() for i in range(num_hands)]
        self.current_turn = 0 
    def play(self):
        self.hands[self.current_turn].play()
        self.current_turn = (self.current_turn+1)%len(self.hands)
这是Python3代码;Python 2中的类应该派生自
对象


。。。虽然他们没有被要求这样做。如果不这样做,它们就会失去一些功能

如果使用旧式类,就会遇到一些奇怪的问题。这就是说,您也可以使用模块级的
\uuuuuu元类
使所有内容都成为新的样式。我一直听说,但使用旧样式的类我还没有遇到太多奇怪的事情(但我在py2中提到您应该从object继承)您是否有使用老式类的特定古怪的链接?主要问题是
super
可能无法很好地发挥作用;显式类型处理将不会像人们预期的那样工作;任何依赖魔法的代码都会被破解(我想这包括了前两项)。我使用的
super
足够多,看起来真的是一场胜利。如果您从未或很少需要从自己的类继承,那么这不太可能是一个问题。如果是的话,解决方法很简单。我想我应该说,这可能会碰到奇怪的角落。真正的问题是这样的问题很难诊断。是的,我通常做显式继承
MyParentClass.\uuuu init\uuuu(self,*args,**kwargs)
type thing。。。即使我知道这是不受欢迎的。(tbh我使用它可能是因为旧式类上的
超级
古怪)哦,显然,新样式对象上的dunder方法不是通过
\uuu getattr\uuu
查找的。