【问题标题】:Class , attribute and method in pythonpython中的类、属性和方法
【发布时间】:2021-10-30 13:43:32
【问题描述】:

您好,我是 python 新手,在网上做这个练习我被卡住了。这是练习,我已经做了什么,有人可以帮助我。

定义一个包含单个占用属性的 Case 类。

此属性在实例化过程中会自动取值''。

在 Case 类中定义一个 play1 方法,如果 case 未被占用,则该方法将为占用的属性赋予值 'X'。

在 Case 类中定义一个 play2 方法,如果 case 未被占用,则该方法将值 'O' 赋予被占用的属性。

这是我的代码的第一部分:

   class Case: 
def __init__(self, occupe):
    self.occupe = ' '
    
def jouer1(self):
    if self.occupe == ' ':
        self.occupe = 'X'
def jouer2(self):
    if self.occupe == ' ':
        self.occupe = 'O'

定义一个具有两个属性的地形类:网格和塔。 grid 属性是一个 Case 类型的 9 元素列表。

turn 属性是一个整数,如果轮到玩家 1 上场,则等于 1;如果轮到玩家 2 上场,则等于 2。

lap 属性将自动初始化为值 1。 在 Terrain 类中定义方法 str,这将允许您对此类的对象使用打印功能。

打印函数应该在第一行显示框 0 到 2 的内容,然后在第二行显示框 3 到 5 的内容,最后在第三行显示框 6 到 8 的内容。

这些框将由字符“|”分隔并且每一行都以匹配行尾字符的 \n 字符结尾。

在类Terrain中定义一个方法play,它的参数是一个0到8之间的整数。根据轮到的玩家,这个方法会调用对应单元格的play1或play2方法。整数传入参数。

然后需要修改 turn 属性的值,以便下一个玩家可以玩。

 class Terrain():
def __init__(self, tour , grille = [0,1,2,3,4,5,6,7,8]):
    self.grille = grille
    self.tour = 1
def __str__(self):
     for i in range(3):
        return self (" | ".__str__() +str(grille[i+3]), end='')  
        print("     0)  1)  2)")
    for i in range(3,6):
        print(" | "+str(grille[i+3]), end='')  
        print("     0)  1)  2)")   
    for i in range(6,9):
        print(" | "+str(grille[i+3]), end='')  

而且我正在阻止我不明白有人可以帮助我的 str 方法。

【问题讨论】:

  • 请更正代码中的缩进。一个直接的观察是你在 Terrain.__str__ 中的循环永远不会完成,因为它在第一次迭代中返回。

标签: python class attributes


【解决方案1】:

str 接受一个类似于整数或浮点数的参数,并将其转换为String(单词)。要将string 和一个数字相加,您需要先将该数字转换为string(一个单词)。

【讨论】:

【解决方案2】:

__str__ 方法用于指定类被视为字符串时的外观。例如,cionsider 一个这样的类:

class myClass:
    def __init__(self, x, y) -> None:
        self.x = x
        self.y = y

当您拨打print(myClass(2, 3)) 时,您会得到如下信息:

__main__.myClass 对象位于 0x00....>

但是,如果你有这样的课程:

class myClass:
    def __init__(self, x, y) -> None:
        self.x = x
        self.y = y

    def __str__(self) -> str:
        return f"x: {self.x}\ny: {self.y}"

然后,当你打电话给print(myClass(2, 3)) 你会得到

x: 2

y: 3

在你的情况下,我认为代码应该是这样的:

class Case:
    def __init__(self) -> None:
        self.occupy = ' '

    def play1(self) -> None:
        if self.occupy == ' ':
            self.occupy = 'X'

    def play2(self) -> None:
        if self.occupy == ' ':
            self.occupy = 'O'

class Terrain:
    def __init__(self, turn: int) -> None:
        self.grid = [Case(), Case(), Case(),
                     Case(), Case(), Case(),
                     Case(), Case(), Case()]
        self.turn = turn
        self.lap = 1

    def __str__(self) -> str:
        line1 = [x.occupy for x in self.grid[:3]]
        line2 = [x.occupy for x in self.grid[3:6]]
        line3 = [x.occupy for x in self.grid[6:]]
        final_string = '\n'.join(['|'.join(line) for line in [line1, line2, line3]])
        return final_string

或者,如果你像我一样,喜欢做单线:

class Case:
    def __init__(self) -> None:
        self.occupy = ' '
    def play1(self) -> None:
        if self.occupy == ' ':
            self.occupy = 'X'
    def play2(self) -> None:
        if self.occupy == ' ':
            self.occupy = 'O'

class Terrain:
    def __init__(self, turn: int) -> None:
        self.grid = [Case() for _ in range(9)]
        self.turn = turn
        self.lap = 1
    def __str__(self) -> str:
        return '\n'.join(map(lambda x: '|'.join(map(lambda y: y.occupy, self.grid[3*x:3*x+3])), range(3)))

另外,请记住__str__ 返回的值必须是字符串。

【讨论】:

  • 感谢所有这些澄清
【解决方案3】:

关于我们能做什么

'在类Terrain中定义一个方法play,其参数为0到8之间的整数。根据轮到的玩家,该方法将调用单元格的方法play1或play2对应传入参数的整数。'

【讨论】:

    猜你喜欢
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多