Python 2 & 3 ไม่นำเข้าโดยไม่ต้องนำเข้ากรองวัตถุตามที่อยู่
แนวทางแก้ไขโดยย่อ:
ส่งคืนdict {attribute_name: attribute_value}อ็อบเจ็กต์ที่กรอง กล่าวคือ{'a': 1, 'b': (2, 2), 'c': [3, 3]}
{k: val for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)}
ส่งคืนรายการ [attribute_names]วัตถุที่กรอง กล่าวคือ['a', 'b', 'c', 'd']
[k for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)]
ส่งคืนรายการ [attribute_values]วัตถุที่กรอง กล่าวคือ[1, (2, 2), [3, 3], {4: 4}]
[val for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)]
ไม่กรองวัตถุ
การลบif
เงื่อนไข กลับ{'a': 1, 'c': [3, 3], 'b': (2, 2), 'e': <function <lambda> at 0x7fc8a870fd70>, 'd': {4: 4}, 'f': <object object at 0x7fc8abe130e0>}
{k: val for k, val in self.__dict__.items()}
วิธีแก้ปัญหาในระยะยาว
ตราบใดที่เริ่มต้นใช้งาน__repr__
ไม่ได้แทนที่if
คำสั่งจะกลับมาTrue
ในกรณีที่แสดงเลขฐานสิบหกของสถานที่ในหน่วยความจำval
ที่อยู่ใน__repr__
สตริงผลตอบแทน
เกี่ยวกับการเริ่มต้นใช้งานของ__repr__
คุณอาจจะพบว่ามีประโยชน์คำตอบนี้ ในระยะสั้น:
def __repr__(self):
return '<{0}.{1} object at {2}>'.format(
self.__module__, type(self).__name__, hex(id(self)))
Wich ส่งคืนสตริงเช่น:
<__main__.Bar object at 0x7f3373be5998>
ตำแหน่งในหน่วยความจำของแต่ละองค์ประกอบได้มาจากid()
วิธีการ
Python Docsพูดเกี่ยวกับ id ():
ส่งคืน "เอกลักษณ์" ของวัตถุ นี่คือจำนวนเต็มซึ่งรับประกันว่าจะไม่ซ้ำกันและคงที่สำหรับออบเจ็กต์นี้ตลอดอายุการใช้งาน วัตถุสองชิ้นที่มีอายุขัยไม่ทับซ้อนกันอาจมีค่า id () เหมือนกัน
รายละเอียดการใช้งาน CPython: นี่คือที่อยู่ของวัตถุในหน่วยความจำ
ลองด้วยตัวเอง
class Bar:
def __init__(self):
self.a = 1
self.b = (2, 2)
self.c = [3, 3]
self.d = {4: 4}
self.e = lambda: "5"
self.f = object()
#__str__ or __repr__ as you prefer
def __str__(self):
return "{}".format(
# Solution in Short Number 1
{k: val for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)}
)
# Main
print(Bar())
เอาท์พุต:
{'a': 1, 'c': [3, 3], 'b': (2, 2), 'd': {4: 4}}
หมายเหตุ :