如何重写python3中的默认类属性值?

2024-04-19 16:41:14 发布

您现在位置:Python中文网/ 问答频道 /正文

这里是Python角。我在做一个“文字冒险”类型的游戏。我正在尝试为游戏项目构建一个类,为这些项目提供各种默认属性。其中一个属性是布尔型的“takeable”,用来指示玩家是否可以拿走这个物品。我已经成功地实现了这一点,但前提是我要为我创建的每个项目分配True或{}给takeable。我已经知道了如何默认为takeable=False,但似乎我不能有选择地将takeable=True传递给“可接受”的少数项目

class Objects():
    """Basic structure of all game objects."""

    def __init__(self, item_name, item_description):
        self.item_name = item_name
        self.item_description = item_description
        self.takeable = False


items = {
    "main_room_table": Objects("Wooden table", "A large wooden table with items scatter atop its surface."),
    "main_room_key": Objects("Small brass key", "A small brass skeleton key. What could it unlock?", takeable=True)

这会导致TypeError: __init__() got an unexpected keyword argument 'takeable'我理解这是因为我在传递参数{},而Python并不需要另一个参数。在

在类实例的创建过程中,有没有一种方法可以覆盖这样的默认值?我知道我可以在每次创建一个新的“item”实例时都传递一个takeable的布尔值,但似乎有一种方法可以默认为一个值,并能够在创建类实例时重写它。在


Tags: 项目实例keynameselffalsetrue游戏
3条回答

您的__init__不接受takeable-参数。您可以将其设为可选参数(如果未给定,则默认为False):

def __init__(self, item_name, item_description, takeable=False):
    [...]
    self.takeable = takeable

您实际上是在描述默认参数:

class Objects():
    """Basic structure of all game objects."""

    def __init__(self, item_name, item_description, takeable=False):
        self.item_name = item_name
        self.item_description = item_description
        self.takeable = takeable

现在您可以选择是否提供takeable作为值,如果不提供,则接受值False。在

默认值被分配给参数,而不是在init定义内。在

class Objects():
    """Basic structure of all game objects."""

    def __init__(self, item_name, item_description, takeable=False):
        self.item_name = item_name
        self.item_description = item_description
        self.takeable = takeable


items = {
    "main_room_table": Objects("Wooden table", "A large wooden table with items scatter atop its surface."),
    "main_room_key": Objects("Small brass key", "A small brass skeleton key. What could it unlock?", takeable=True),
}

另一种方法是在创建之后设置它,但这需要它在dict之外用items["main_room_key"].takeable = True来设置它

相关问题 更多 >