Python 2 ve 3, içe aktarmadan, nesneleri adreslerine göre filtreler
Kısaca çözümler:
Döndür dikte {öznitelik_adı: öznitelik_değer} , nesneler filtrelenir. yani{'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)}
Döndürme listesi [öznitelik_simleri] , filtrelenen nesneler. yani['a', 'b', 'c', 'd']
[k for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)]
Döndürme listesi [öznitelik_değerleri] , filtrelenen nesneler. yani[1, (2, 2), [3, 3], {4: 4}]
[val for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)]
Nesneleri filtrelememek
if
Koşul kaldırılıyor . Dönüş{'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()}
Uzun çözüm
Sürece varsayılan uygulama olarak __repr__
kılınır değilif
deyimi dönecektir True
anısına yerin onaltılık gösterimi eğer val
içindedir __repr__
dönüş dize.
Varsayılan uygulamanızla ilgili olarak, bu cevap__repr__
yararlı olabilir . Kısacası:
def __repr__(self):
return '<{0}.{1} object at {2}>'.format(
self.__module__, type(self).__name__, hex(id(self)))
Wich şöyle bir dize döndürür:
<__main__.Bar object at 0x7f3373be5998>
Her bir elemanın hafızasındaki konumu id()
yöntemle elde edilir.
Python Docs id () hakkında şunları söylüyor:
Bir nesnenin "kimliğini" döndürür. Bu, ömrü boyunca bu nesne için benzersiz ve sabit olması garanti edilen bir tamsayıdır. Örtüşmeyen yaşam sürelerine sahip iki nesne aynı id () değerine sahip olabilir.
CPython uygulama ayrıntısı: Bu, bellekteki nesnenin adresidir.
Kendiniz deneyin
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())
Çıktı:
{'a': 1, 'c': [3, 3], 'b': (2, 2), 'd': {4: 4}}
Not :