Kullanmadan önce yazıldığı gibi obj.__dict__yaygın vakaları işleyebilir, ancak bazı sınıflar bu __dict__özelliğe ve kullanıma sahip değildir __slots__(çoğunlukla bellek verimliliği için).
Bunu yapmanın daha esnek bir yolu için örnek:
class A(object):
__slots__ = ('x', 'y', )
def __init__(self, x, y):
self.x = x
self.y = y
class B(object):
def __init__(self, x, y):
self.x = x
self.y = y
def get_object_attrs(obj):
try:
return obj.__dict__
except AttributeError:
return {attr: getattr(obj, attr) for attr in obj.__slots__}
a = A(1,2)
b = B(1,2)
assert not hasattr(a, '__dict__')
print(get_object_attrs(a))
print(get_object_attrs(b))
bu kodun çıktısı:
{'x': 1, 'y': 2}
{'x': 1, 'y': 2}
Not1:
Python dinamik bir dildir ve öznitelikleri almaya çalıştığınız sınıfları bilmek her zaman daha iyidir, çünkü bu kod bile bazı durumları kaçırabilir.
Not2:
Bu kod yalnızca sınıf değişkenleri sağlanmayan örnek değişkenleri verir. Örneğin:
class A(object):
url = 'http://stackoverflow.com'
def __init__(self, path):
self.path = path
print(A('/questions').__dict__)
kod çıkışları:
{'path': '/questions'}
Bu kod, urlsınıf niteliğini yazdırmaz ve istenen sınıf niteliklerini atlayabilir.
Bazen bir özelliğin bir örnek üyesi olduğunu düşünebiliriz, ancak bu örnek kullanılarak gösterilmez ve gösterilmez.
NewClass. Gibi bir adlandırma kuralı kullanırsanız, insanların beklentilerini karşılayabilirsiniznew_class.