Tôi đang viết container của riêng mình, nó cần cấp quyền truy cập vào một từ điển bên trong bằng các lệnh gọi thuộc tính. Việc sử dụng điển hình của container sẽ như thế này:
dict_container = DictContainer()
dict_container['foo'] = bar
...
print dict_container.foo
Tôi biết rằng có thể thật ngu ngốc khi viết một cái gì đó như thế này, nhưng đó là chức năng tôi cần cung cấp. Tôi đã suy nghĩ về việc thực hiện điều này theo một cách sau:
def __getattribute__(self, item):
try:
return object.__getattribute__(item)
except AttributeError:
try:
return self.dict[item]
except KeyError:
print "The object doesn't have such attribute"
Tôi không chắc liệu các khối thử / ngoại trừ lồng nhau có phải là một cách thực hành tốt hay không nên sử dụng một cách khác hasattr()
và has_key()
:
def __getattribute__(self, item):
if hasattr(self, item):
return object.__getattribute__(item)
else:
if self.dict.has_key(item):
return self.dict[item]
else:
raise AttributeError("some customised error")
Hoặc để sử dụng một trong số chúng và thử một khối bắt như thế này:
def __getattribute__(self, item):
if hasattr(self, item):
return object.__getattribute__(item)
else:
try:
return self.dict[item]
except KeyError:
raise AttributeError("some customised error")
Lựa chọn nào là pythonic và thanh lịch nhất?
if 'foo' in dict_container:
. Amen.