Vấn đề
Tôi đang làm việc với một dự án Python có lớp chính là một chút God God Đối tượng . Có nên friggin' nhiều thuộc tính và phương pháp!
Tôi muốn cấu trúc lại lớp.
Cho đến nay…
Bước đầu tiên, tôi muốn làm một cái gì đó tương đối đơn giản; nhưng khi tôi thử cách tiếp cận đơn giản nhất, nó đã phá vỡ một số thử nghiệm và các ví dụ hiện có.
Về cơ bản, lớp này có một danh sách các thuộc tính loooong nhưng tôi có thể nhìn rõ chúng và nghĩ rằng, 5 thuộc tính này có liên quan với nhau. 8 cái này cũng có liên quan
nhận được
Về cơ bản tôi chỉ muốn nhóm các thuộc tính liên quan thành một lớp người trợ giúp giống như chính tả. Tôi đã có một cảm giác __getattr__
sẽ là lý tưởng cho công việc. Vì vậy, tôi đã chuyển các thuộc tính sang một lớp riêng biệt, và, chắc chắn, __getattr__
hoạt động phép thuật của nó hoàn toàn tốt
Lúc đầu .
Nhưng sau đó tôi đã thử chạy một trong những ví dụ. Lớp con ví dụ cố gắng đặt một trong các thuộc tính này trực tiếp (ở cấp độ lớp ). Nhưng vì thuộc tính này không còn nằm trên cơ sở vật lý, trong lớp cha, tôi đã gặp lỗi khi nói rằng thuộc tính này không tồn tại.
@bất động sản
Sau đó tôi đọc lên về @property
trang trí. Nhưng sau đó tôi cũng đọc rằng nó tạo ra các vấn đề cho các lớp con muốn thực hiện self.x = blah
khi x
là một thuộc tính của lớp cha.
Mong muốn
- Có tất cả mã khách hàng tiếp tục hoạt động bằng cách sử dụng
self.whatever
, ngay cả khiwhatever
tài sản của cha mẹ không phải là xác định vị trí vật lý trong chính lớp (hoặc ví dụ). - Nhóm thuộc tính liên quan vào các thùng chứa giống như dict.
- Giảm sự ồn ào cực độ của mã trong lớp chính.
Ví dụ, tôi không chỉ đơn giản muốn thay đổi điều này:
larry = 2
curly = 'abcd'
moe = self.doh()
Vào đây:
larry = something_else('larry')
curly = something_else('curly')
moe = yet_another_thing.moe()
Vì thế mà vẫn ồn ào. Mặc dù điều đó thành công biến một thuộc tính đơn giản thành thứ gì đó có thể quản lý dữ liệu, bản gốc có 3 biến và phiên bản được điều chỉnh vẫn có 3 biến.
Tuy nhiên, tôi sẽ ổn với thứ như thế này:
stooges = Stooges()
Và nếu tìm kiếm self.larry
thất bại, một cái gì đó sẽ kiểm tra stooges
và xem nếu larry
có. (Nhưng nó cũng phải hoạt động nếu một lớp con cố gắng thực hiện larry = 'blah'
ở cấp lớp.)
Tóm lược
- Muốn thay thế các nhóm thuộc tính có liên quan trong lớp cha bằng một thuộc tính duy nhất lưu trữ tất cả dữ liệu ở nơi khác
- Muốn làm việc với mã máy khách hiện có sử dụng (ví dụ)
larry = 'blah'
ở cấp độ lớp - Muốn tiếp tục cho phép các lớp con mở rộng, ghi đè và sửa đổi các thuộc tính được cấu trúc lại này mà không biết bất cứ điều gì đã thay đổi
Điều này có thể không? Hay tôi đang sủa sai cây?