Như được viết trước khi sử dụng obj.__dict__
có thể xử lý các trường hợp phổ biến nhưng một số lớp không có __dict__
thuộc tính và sử dụng __slots__
(chủ yếu là cho hiệu quả bộ nhớ).
ví dụ cho một cách kiên cường hơn để làm điều này:
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))
đầu ra của mã này:
{'x': 1, 'y': 2}
{'x': 1, 'y': 2}
Lưu ý1:
Python là một ngôn ngữ động và luôn biết rõ hơn về các lớp bạn đang cố gắng lấy các thuộc tính vì ngay cả mã này cũng có thể bỏ lỡ một số trường hợp.
Lưu ý2:
mã này chỉ xuất ra các biến thể hiện có nghĩa là các biến lớp không được cung cấp. ví dụ:
class A(object):
url = 'http://stackoverflow.com'
def __init__(self, path):
self.path = path
print(A('/questions').__dict__)
mã đầu ra:
{'path': '/questions'}
Mã này không in url
thuộc tính lớp và có thể bỏ qua các thuộc tính lớp mong muốn.
Đôi khi chúng ta có thể nghĩ rằng một thuộc tính là một thành viên thể hiện nhưng nó không và sẽ không được hiển thị bằng ví dụ này.
NewClass
. Bạn có thể bất chấp sự mong đợi của mọi người nếu bạn sử dụng quy ước đặt tên như thế nàonew_class
.