Tôi đang cố gắng xây dựng một khung công tác cli nơi các lệnh cần được thêm động. Điều tôi muốn đạt được là - Tôi sẽ có một lớp tối thiểu kế thừa từ cmd.Cmd và sau này tôi sẽ viết các lệnh trong các lớp riêng biệt và tải các lệnh này cùng với lớp chính.
Dưới đây là những gì tôi đã thử nhưng khi thử thực hiện lệnh showmore thì nó báo TypeError
nhập cmd
lớp MyExtraCmds(cmd.Cmd):
def do_showmore(self, *args):
in(loại(tự))
print("Hiển thị thêm lệnh")
lớp MyCmd(cmd.Cmd):
def __init__(self, target=None, user=None, passwd=None):
cmd.Cmd.__init__(tự)
def do_show(self, *args):
in(loại(tự))
print("Hiển thị lệnh")
def do_EOF(tự, dòng):
trả về Đúng
if __name__ == "__main__":
setattr(MyCmd, 'do_showmore', MyExtraCmds.do_showmore)
in(dir(MyCmd))
mục tiêu = MyCmd()
target.cmdloop()
EDIT 2: Tôi nghĩ bạn phải sử dụng Python 2 vì trong Python 3, điều này chỉ hoạt động...
MyExtrasCommand là một lớp khác nên lớp này sẽ không hoạt động vì với InstanceMethod bình thường, đối số đầu tiên phải là một thể hiện của lớp đó.
Nhưng lớp Pythonđang mở;Bạn có thể thêm nó sau. Cách dễ nhất là bắt đầu với các phương thức hiện không có trong lớp và sau đó thêm chúng vào lớp một cách chính xác khi chạy. Ví dụ: điều này hoạt động tốt:
nhập cmd
def do_showmore(self, *args):
in(loại(tự))
print("Hiển thị thêm lệnh")
lớp MyCmd(cmd.Cmd):
def __init__(self, target=None, user=None, passwd=None):
cmd.Cmd.__init__(tự)
def do_show(self, *args):
in(loại(tự))
print("Hiển thị lệnh")
def do_EOF(tự, dòng):
trả về Đúng
if __name__ == "__main__":
setattr(MyCmd, 'do_showmore', do_showmore)
in(dir(MyCmd))
mục tiêu = MyCmd()
target.cmdloop()
Nếu bạn in loại MyCmd.do_showmore, bạn sẽ thấy hàm của bạn được gói chính xác vào InstanceMethod.
Chỉnh sửa (Chỉ trích dẫn - bạn có thểkhông thực sựMuốn làm điều này...)
Vì mọi thứ trong Python đều mở và có thể kiểm tra được nên bạnCó thểLàm cho phương thức ban đầu hoạt động bằng cách thay đổi một dòng. Phần sau đây sẽ chạy trong Python 2.7:
setattr(MyCmd, 'do_showmore', MyExtraCmds.do_showmore.im_func)
Đối với Python 2.7, đây sẽ là .im_func
được thêm vào cuối dòng có nghĩa là "Lấy hàm cơ bản từ phương thức không liên kết MyExtraCmds.do_showmore và sử dụng nó." Tôi đề cập đến điều này vì đôi khi có những lý do chính đáng để sử dụng thuật toán đen tối như vậy. Nhưng trường hợp sử dụng bạn mô tả có vẻ không phù hợp ở đây và ví dụ: nếu bạn hỏi MyExtraCmds
Đã thêm các biến lớp bổ sung và dự kiến do_showmore
để truy cập chúng. bạn đến từ MyExtraCmds
loại bỏ và thêm vào MyCmd
Các chức năng trong sẽ không còn được hiểu nữa MyExtraCmds
, do đó gây hiểu lầm và khó hiểu.
Tôi là một lập trình viên xuất sắc, rất giỏi!