Tôi có một số đối tượng thuộc nhiều loại khác nhau (tên hàm khác nhau, chữ ký khác nhau) và tôi vá chúng để có cách phổ biến để truy cập chúng từ các chức năng khác nhau. Tóm lại, có một điều phối viên đưa các đối tượng mà tôi muốn vá và tùy thuộc vào kiểu đối tượng mà nó gọi là trình vá khác nhau. Một Patcher sẽ bổ sung thêm phương pháp để các đối tượng:Thêm lớp cơ sở vào đối tượng hiện có trong python
def patcher_of_some_type(object):
def target(self, value):
# do something and call self methods
object.target = types.MethodType(target, object)
# many more of these
Là chương trình phát triển phức tạp hơn thực hiện một wrapper xung quanh đối tượng (hoặc các lớp đối tượng) có vẻ là ý tưởng tốt hơn. Một số bản vá có chung mã hoặc tương quan với nhau. Nhưng tôi không kiểm soát việc tạo đối tượng, cũng không tạo ra lớp học. Tôi chỉ lấy được đồ vật. Và ngay cả khi tôi có thể làm điều đó, tôi chỉ muốn bọc (hoặc vá) một số vật thể, không phải tất cả.
Một giải pháp có thể là thêm lớp cơ sở vào đối tượng hiện có, nhưng tôi không chắc chắn về cách bảo trì và an toàn này. Có giải pháp nào khác không?
Vì vậy, các lớp học không được xác định từ bạn? – dav1d
Không, các lớp học được định nghĩa trong một thư viện mà tôi không kiểm soát. Tôi có thể tạo trình bao bọc từ tất cả các lớp, nhưng điều này sẽ chỉ làm việc cho các đối tượng mà tôi khởi tạo, không phải cho các đối tượng được thư viện khởi tạo. Nếu tôi vá thư viện, cuộc trò chuyện sẽ xảy ra: tất cả các đối tượng đều được vá và tôi chỉ muốn vá một số thứ đó. Cuối cùng, nếu tôi bao bọc một số đối tượng, tôi sẽ cần giữ cơ sở dữ liệu của riêng mình để chỉ chúng. Đó là lý do tại sao bây giờ tôi đang vá các đồ vật mà tôi muốn. – Hernan
Tôi sẽ định nghĩa một lớp bao bọc để giữ các đối tượng. Sự cần thiết phải có các loại trình bao bọc khác nhau chia sẻ mã chung có thể được xử lý bằng cách có lớp trình bao bọc cơ sở và phát sinh các phiên bản chuyên biệt từ nó. Công cụ OOP cơ bản ... – martineau