Tôi tạo một lớp có đối tượng được khởi tạo với một loạt mã XML. Lớp này có khả năng trích xuất các tham số khác nhau ra khỏi XML đó và lưu chúng vào bên trong các biến trạng thái của đối tượng. Số lượng tiềm năng của các tham số này lớn và có thể là hầu hết người dùng sẽ không cần hầu hết các thông số đó. Đó là lý do tại sao tôi đã quyết định thực hiện khởi tạo "lười biếng".Getter với hiệu ứng phụ
Trong trường hợp kiểm tra sau, thông số này là title
. Khi người dùng cố gắng truy cập vào nó lần đầu tiên, hàm getter phân tích cú pháp XML, đúng cách khởi tạo các biến trạng thái và trở về giá trị của nó:
class MyClass(object):
def __init__(self, xml=None):
self.xml = xml
self.title = None
def get_title(self):
if self.__title is None:
self.__title = self.__title_from_xml()
return self.__title
def set_title(self, value):
self.__title = value
title = property(get_title, set_title, None, "Citation title")
def __title_from_xml(self):
#parse the XML and return the title
return title
này trông đẹp và hoạt động tốt đối với tôi. Tuy nhiên, tôi bị quấy rầy một chút bởi thực tế là chức năng getter thực sự là một "setter" một trong những ý nghĩa rằng nó có một tác dụng phụ rất đáng kể về đối tượng. Đây có phải là mối quan tâm chính đáng không? Nếu vậy, làm thế nào tôi nên giải quyết nó?
Bất kể câu trả lời thực tế cho câu hỏi là gì, bạn không nên sử dụng dấu gạch dưới kép hàng đầu. Họ bắt đầu mang tên mangling, tức là rất nhiều đau tiềm năng và không đạt được. Chỉ cần sử dụng một dấu gạch dưới hàng đầu. – delnan
Tôi không hiểu tại sao đó là vấn đề. –
Đề xuất tái cấu trúc nhỏ: không khởi tạo 'self._title' trong hàm tạo và thay thế điều kiện trong trình khởi động bằng' not hasrr (self, "_title") '. –