创建 Class 和对象

Creating a Class and Objects

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

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)

所以我的问题是如何将这些对象(Mark、Lisa)添加到 set() 中。如果有人能给我一些提示,我将不胜感激。

假设您希望将 class 个实例 MarkLisa 本身添加到一个集合中,Python 3 中的一个简单方法是利用 dataclasses——本质上只是常规的classes——并将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}

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

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 方法。这允许您保留类型提示支持和将关键字参数传递给原始示例中的构造函数方法的能力,但也使每个 class 实例本质上可哈希,因为 命名元组 本质上是 tuplesNamedTuple 的用法示例如下所示:

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)}