【问题标题】:Variable naming in Python classesPython 类中的变量命名
【发布时间】:2014-07-22 12:49:34
【问题描述】:

所以我最近开始使用 python。我正在做一个涉及课程的小项目。在大多数情况下,我已经习惯了使用 self... 等。我还没有弄清楚可能与我的问题有关的名称修饰。

这里有一些代码组成了一个类来创建一个回合对象,我可以在战斗开始时启动它并允许我定期切换回合。 (游戏将是一个口袋妖怪战斗模拟器)

class turn:

    TURNS = ("player","computer")
    curr=0

    def __init__(self): 
        self.currentTurn=turn.TURNS[turn.curr]

    def getTurn(self):
        return turn.TURNS[turn.curr]

    def switch(self):
        if turn.curr == 0: 
            turn.curr = 1 
        else:   
            turn.curr = 0

        if turn.curr==0: 
            print "It's your move! \n"

        self.currentTurn=TURNS[turn.curr]

所以我的问题是这样的:

python 是否有任何功能可以让我在引用类变量时省略类名。我觉得它应该知道在类定义中查找这些变量,但事实并非如此。另外,如果我想在同一个类中使用辅助方法,我似乎必须在前面加上 self.

这里面还有吗?

【问题讨论】:

  • Martjin,当您为我修复错误时,我正在编辑,谢谢。当我尝试制作“turn”的所有实例时,SO 编辑器为我添加了这些星星。粗体
  • "显式优于隐式。"像这样接受 Python 的教条。对您来说可能看起来不错的功能对于下一个试图理解您的代码的开发人员来说可能会遇到很多麻烦。
  • @user3756732:不支持在代码块中格式化;在代码块之外** 使事情变得大胆。

标签: python class scope


【解决方案1】:

您可以使用type(self)self.__class__ 引用当前类。考虑到该值会随着类的子类化而变化。

所以:

class turn(object):
    def __init__(self): 
        cls = type(self)
        self.currentTurn = cls.TURNS[cls.curr]

    def getTurn(self):
        cls = type(self)
        return cls.TURNS[cls.curr]

    def switch(self):
        cls = type(self)
        cls.curr = 1 - cls.curr

        if cls.curr == 0: 
            print "It's your move! \n"

        self.currentTurn = cls.TURNS[cls.curr]

但如果您要继承 turns,那么 设置 cls.curr 将在子类上完成,而不是在您调用 subclass().switch() 时在 turn 父类上完成。

您也可以使用self.__class__ 属性,但使用内置函数可以让代码更具可读性。

但是,请注意,只要没有同名的实例属性,您也可以在self 上引用您的类属性;以下也适用:

class turn(object):
    def __init__(self): 
        self.currentTurn = self.TURNS[self.curr]

    def getTurn(self):
        return self.TURNS[self.curr]

    def switch(self):
        cls = type(self)
        cls.curr = 1 - cls.curr

        if self.curr == 0: 
            print "It's your move! \n"

        self.currentTurn = self.TURNS[self.curr]

设置类属性仍然需要您直接在类上这样做,而不是self

【讨论】:

  • “子类化”是指如果我要在该类中放置另一个类定义?
  • @user3756732:您可以创建一个派生类,它重用turn 中的所有内容、添加或替换功能。 class subclass(turn): pass 是一个无用的子类,只是继承了所有内容而不添加。
  • @user3756732:见Inheritance in the Python toturial
  • @user3756732:顺便说一句,我假设您在这里使用的是 Python 3;在 Python 2 中,确保继承自 object(新式类),否则 type(self) 将不起作用。
  • 谢谢,这很有帮助,而且我知道继承,这个想法目前还没有在我的脑海中出现,这似乎很明显,哈哈。感谢您进行编辑以使其更清晰
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 2021-04-29
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多