Python 2 & 3, cho đến khi nhập, lọc các đối tượng theo địa chỉ của chúng
Các giải pháp trong ngắn hạn:
Trả về dict {property_name: thuộc tính_value} , các đối tượng được lọc. I E{'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)}
Trả về danh sách [tên_tính_tính] , các đối tượng được lọc. I E['a', 'b', 'c', 'd']
[k for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)]
Trả về danh sách [giá_trị_ thuộc tính] , các đối tượng được lọc. I E[1, (2, 2), [3, 3], {4: 4}]
[val for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)]
Không lọc đối tượng
Loại bỏ if
điều kiện. Trở về{'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()}
Giải pháp lâu dài
Miễn là việc triển khai mặc định của __repr__
không bị ghi đè , if
câu lệnh sẽ trả về True
nếu biểu diễn thập lục phân của vị trí trong bộ nhớ val
nằm trong __repr__
chuỗi trả về.
Về việc triển khai mặc định của __repr__
bạn, bạn có thể tìm thấy câu trả lời hữu ích này . Nói ngắn gọn:
def __repr__(self):
return '<{0}.{1} object at {2}>'.format(
self.__module__, type(self).__name__, hex(id(self)))
Wich trả về một chuỗi như:
<__main__.Bar object at 0x7f3373be5998>
Vị trí trong bộ nhớ của mỗi phần tử được lấy thông qua id()
phương thức.
Tài liệu Python nói về id ():
Trả lại "danh tính" của một đối tượng. Đây là một số nguyên được đảm bảo là duy nhất và không đổi cho đối tượng này trong suốt thời gian tồn tại của nó. Hai đối tượng có vòng đời không trùng lặp có thể có cùng giá trị id ().
Chi tiết triển khai CPython: Đây là địa chỉ của đối tượng trong bộ nhớ.
Hãy thử một mình
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())
Đầu ra:
{'a': 1, 'c': [3, 3], 'b': (2, 2), 'd': {4: 4}}
Ghi chú :