我得到了一個任務。我必須用物件創建一個類。例如,學生類。在這門課中,我必須創建某些學生,然后我必須將這些學生分配到一個集合中。
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() 中。如果有人能給我一些提示,我將不勝感激。
uj5u.com熱心網友回復:
假設您希望將類實體Mark和Lisa它們本身添加到一個集合中,Python 3 中的一個簡單方法是使用資料類——它們本質上只是引擎蓋下的常規類——并將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為其屬性的a并將其傳遞給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而不是資料類方法。這允許您保留型別提示支持和將關鍵字引數傳遞給建構式方法的能力,就像在原始示例中一樣,但也使每個類實體本質上是可散列的,因為命名元組本質上是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)}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/367738.html
