创建 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 个实例 Mark
和 Lisa
本身添加到一个集合中,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 实例本质上可哈希,因为 命名元组 本质上是 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)}
我接到了任务。我必须用对象创建一个 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 个实例 Mark
和 Lisa
本身添加到一个集合中,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 实例本质上可哈希,因为 命名元组 本质上是 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)}