【问题标题】:Creating a Class and Objects [closed]创建一个类和对象[关闭]
【发布时间】:2021-11-26 14:37:03
【问题描述】:

我有一个任务。我必须用对象创建一个类。例如,学生类。在这个课程中,我必须创建某些学生,然后我必须将这些学生分配到一个集合中。

class Students:
    def __init__(self, name, age):
        self.name = name
        self.age = age


    def show_info(self):
        return "'{}': {}".format(self.name, self.age)

    def __str__(self):
        return self.show_info()

Mark = Students(name="Mark", age=21)
Lisa = Students(name="Lisa", age=19)

所以我的问题是如何将这些对象(马克,丽莎)添加到集合()中。如果有人能给我一些提示,我将不胜感激。

【问题讨论】:

  • students = set([Mark, Lisa])。或者,梳理一下:students = set([Students(name="Mark", age=21), Students(name="Lisa", age=19)])。或者使用{} 表示法来表示集合:students = {Mark, Lisa}
  • set([Mark, Lisa])set 采用可迭代的,而不是任意的元素序列。
  • 请注意,最好将您的班级命名为Student:单数,而不是复数。虽然您可以在班级中创建多个学生,但每个单独的对象都是一个学生,因此是 Student 班级。
  • 您也可以使用花括号文字来制作集合
  • 使用typing.NamedTuple 快速解决您的问题 - 另请参阅下面我的回答。

标签: python python-3.x class object set


【解决方案1】:

假设您希望将类实例 MarkLisa 本身添加到集合中,Python 3 中的一种简单方法是使用 dataclasses ——它们本质上只是底层的常规类—— - 并将unsafe_hash参数传递给装饰器,这样就自动为我们生成了一个__hash__方法,如下所示。

from dataclasses import dataclass


@dataclass(unsafe_hash=True)
class Student:
    name: str
    age: int

    def show_info(self):
        return "'{}': {}".format(self.name, self.age)

    def __str__(self):
        return self.show_info()


Mark = Student(name="Mark", age=21)
Lisa = Student(name="Lisa", age=19)

my_set = {Mark, Lisa}
print(my_set)

# If you want to customize how `Student` objects are displayed, implement
# a __repr__ instead of __str__, or just copy the implementation directly.
Student.__repr__ = Student.__str__
print(my_set)

输出:

{Student(name='Lisa', age=19), Student(name='Mark', age=21)}
{'Lisa': 19, 'Mark': 21}

如果您想将实例 attributes 添加到集合中,您可以将每个实例转换为其属性的 tuple 并将其传递给 set 构造函数,因为元组是不可变对象,因此是可散列的。这实际上是由dataclasses 模块导出的astuple 辅助函数的一个很好的用例。

from dataclasses import dataclass, astuple


@dataclass
class Student:
    name: str
    age: int


Mark = Student(name="Mark", age=21)
Lisa = Student(name="Lisa", age=19)

my_set = {astuple(Mark), astuple(Lisa)}
print(my_set)

输出:

{('Lisa', 19), ('Mark', 21)}

上述概念的简化是使用typing.NamedTuple 代替dataclass 方法。这允许您保留类型提示支持以及将关键字参数传递给构造函数方法的能力,就像在原始示例中一样,而且还使每个类实例固有地可散列,因为 命名元组 本质上是 tuples在引擎盖下。 NamedTuple 的用法示例如下所示:

from typing import NamedTuple


class Student(NamedTuple):
    name: str
    age: int


Mark = Student(name="Mark", age=21)
Lisa = Student(name="Lisa", age=19)

my_set = {Mark, Lisa}
print(my_set)

输出:

{Student(name='Lisa', age=19), Student(name='Mark', age=21)}

【讨论】:

    猜你喜欢
    • 2016-10-14
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    相关资源
    最近更新 更多