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, url
sı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
.