Trình trang trí Python rất thú vị để sử dụng, nhưng tôi dường như đã va vào tường do các đối số được chuyển đến trang trí. Ở đây tôi có một trang trí được định nghĩa là một phần của một lớp cơ sở (trình trang trí sẽ truy cập các thành viên lớp do đó nó sẽ yêu cầu tham số tự).Trình trang trí Python là một phần của một lớp cơ sở không thể được sử dụng để trang trí các chức năng của thành viên trong các lớp kế thừa
class SubSystem(object):
def UpdateGUI(self, fun): #function decorator
def wrapper(*args):
self.updateGUIField(*args)
return fun(*args)
return wrapper
def updateGUIField(self, name, value):
if name in self.gui:
if type(self.gui[name]) == System.Windows.Controls.CheckBox:
self.gui[name].IsChecked = value #update checkbox on ui
elif type(self.gui[name]) == System.Windows.Controls.Slider:
self.gui[name].Value = value # update slider on ui
...
Tôi đã bỏ qua phần còn lại của quá trình triển khai. Bây giờ lớp này là một lớp cơ sở cho các Hệ thống con khác nhau sẽ kế thừa từ nó - một số lớp được thừa hưởng sẽ cần sử dụng trình trang trí UpdateGUI.
class DO(SubSystem):
def getport(self, port):
"""Returns the value of Digital Output port "port"."""
pass
@SubSystem.UpdateGUI
def setport(self, port, value):
"""Sets the value of Digital Output port "port"."""
pass
Một lần nữa tôi đã bỏ qua triển khai chức năng vì chúng không liên quan.
Nói tóm lại vấn đề là trong khi tôi có thể truy cập vào trang trí được định nghĩa trong lớp cơ sở từ lớp kế thừa bởi specifiying nó như SubSystem.UpdateGUI, tôi cuối cùng có được TypeError này khi cố gắng sử dụng nó:
unbound method UpdateGUI() must be called with SubSystem instance as first argument (got function instance instead)
Điều này là do tôi không có cách nào nhận dạng được thông số self
ngay lập tức cho người trang trí!
Có cách nào để thực hiện việc này không? Hay tôi đã đạt đến giới hạn của việc triển khai trang trí hiện tại bằng Python?
Điều này đã hiệu quả! Không bao giờ có thể nghĩ để biến decorator thành một classmethod. – Aphex
Để tham khảo trong tương lai, đây là nghĩa đen là một dòng sửa chữa bằng cách thêm @classmethod trước khi def UpdateGUI (tự, vui vẻ). – Aphex
@Aphex. bạn nên thay thế việc sử dụng 'self' bằng cách sử dụng' cls' như KennyTM đã cho thấy. Điều này sẽ làm cho mã của bạn dễ đọc hơn nhiều. – aaronasterling