Tôi đang viết một ứng dụng. Không có giao diện ưa thích: s hoặc bất cứ thứ gì, chỉ là một ứng dụng giao diện điều khiển cũ đơn giản. Ứng dụng này, cho phép gọi nó là Ứng dụng, cần có khả năng tải các plugin khi khởi động. Vì vậy, một cách tự nhiên, tôi đã tạo ra một lớp học cho các plugin để kế thừa từ:Nhập động các mô-đun theo sau là sự khởi tạo của các đối tượng với một baseclass nhất định từ các mô-đun đã nêu
class PluginBase(object):
def on_load(self):
pass
def on_unload(self):
pass
def do_work(self, data):
pass
Ý tưởng được rằng khi khởi động, ứng dụng sẽ đi bộ qua các thư mục hiện hành, bao gồm subdirs, tìm kiếm các module chứa các lớp học mà bản thân chúng là lớp con của PluginBase
.
Nhiều mã:
class PluginLoader(object):
def __init__(self, path, cls):
""" path=path to search (unused atm), cls=baseclass """
self.path=path
def search(self):
for root, dirs, files in os.walk('.'):
candidates = [fname for fname in files if fname.endswith('.py') \
and not fname.startswith('__')]
## this only works if the modules happen to be in the current working dir
## that is not important now, i'll fix that later
if candidates:
basename = os.path.split(os.getcwd())[1]
for c in candidates:
modname = os.path.splitext(c)[0]
modname = '{0}.{1}'.format(basename, modname)
__import__(mod)
module = sys.modules[mod]
Sau đó dòng cuối cùng trong search
Tôi muốn bằng cách nào đó a) tất cả các lớp trong mô-đun mới nạp, b) kiểm tra nếu một hoặc nhiều hơn những lớp là lớp con của PluginBase
và c) (nếu b) khởi tạo/các lớp đó và thêm vào danh sách các mô-đun đã tải của ứng dụng.
Tôi đã thử các kết hợp khác nhau của issubclass
và các loại khác, theo sau là khoảng thời gian cường độ cao dir
: ing và khoảng một giờ googling hoảng sợ. Tôi đã tìm thấy một cách tiếp cận tương tự như của tôi here và tôi đã thử sao chép và dán nhưng có lỗi nói rằng Python không hỗ trợ nhập bằng tên tệp, tại thời điểm đó tôi bị mất tập trung và kết quả là, bài đăng này đã được viết.
Tôi đang kết thúc ở đây, tất cả trợ giúp đều được đánh giá cao.
Nó làm việc gần như hoàn hảo, cảm ơn bạn! Tôi đã thêm 'và cls .__ name__! = Base .__ name__' để tránh lớp cơ sở đang được thêm vào danh sách các lớp con. – manneorama