Browse Source

添加了template模块

Huan 5 năm trước cách đây
mục cha
commit
e016cde425

+ 42 - 18
algebraicfactory/template.py

@@ -4,8 +4,28 @@ from sympy import simplify, count_ops, Float, Integer, Rational, sympify, factor
     Symbol, solve, true, false, plot
 from sympy.plotting import plot3d
 
+from system import plugin_class_loading, get_path, plugin_func_loading
 
-class AlgebraFormat:
+
+class __AlgebraInit:
+    def __init__(self, new=lambda x: x):
+        self.symbol_dict = {"self": self}  # 命名空间
+        self.symbol_dict.update(globals())
+        self.symbol_dict.update(locals())
+        self.algebra_dict = {}
+        self.algebra_dict_view = {}  # 门面(str)
+        self.symbol_describe = {}  # 描述文件
+        self.out_status = new
+
+    def get_expression(self, name, exp_str=False):
+        if exp_str:
+            return self.algebra_dict_view[name]
+        else:
+            return self.algebra_dict[name]
+
+
+@plugin_class_loading(get_path(r"template/algebraicfactory"))
+class AlgebraFormat(__AlgebraInit):
     def formula_export(self, f):
         result_str = []
         try:
@@ -92,23 +112,7 @@ class AlgebraFormat:
             result_str.append(["B", a, b])
 
 
-class __AlgebraInit:
-    def __init__(self, new=lambda x: x):
-        self.symbol_dict = {"self": self}  # 命名空间
-        self.symbol_dict.update(globals())
-        self.symbol_dict.update(locals())
-        self.algebra_dict = {}
-        self.algebra_dict_view = {}  # 门面(str)
-        self.symbol_describe = {}  # 描述文件
-        self.out_status = new
-
-    def get_expression(self, name, exp_str=False):
-        if exp_str:
-            return self.algebra_dict_view[name]
-        else:
-            return self.algebra_dict[name]
-
-
+@plugin_class_loading(get_path(r"template/algebraicfactory"))
 class AlgebraPrint(__AlgebraInit):
     def print_expression_core(self, e, level=0, first=True, q=1):  # 递归
         str_print = " " * level
@@ -137,6 +141,7 @@ class AlgebraPrint(__AlgebraInit):
         return self.print_expression_core(e, level, first)
 
 
+@plugin_class_loading(get_path(r"template/algebraicfactory"))
 class AlgebraSplit(__AlgebraInit):
     def split_func_core(self, exp, deep, name_list, first=True):  # 递归
         try:
@@ -163,6 +168,7 @@ class AlgebraSplit(__AlgebraInit):
             return [exp]
 
 
+@plugin_class_loading(get_path(r"template/algebraicfactory"))
 class AlgebraMerge(__AlgebraInit):
     def merge_func_core(self, name_list, func):
         if len(name_list) < 2:
@@ -173,6 +179,7 @@ class AlgebraMerge(__AlgebraInit):
         return st
 
 
+@plugin_class_loading(get_path(r"template/algebraicfactory"))
 class AlgebraBase(AlgebraFormat, AlgebraPrint, AlgebraSplit, AlgebraMerge):
 
     def simplify(self, alg, radio=1.7, func=None, rat=True, inv=False):  # 函数简化
@@ -199,6 +206,7 @@ class AlgebraBase(AlgebraFormat, AlgebraPrint, AlgebraSplit, AlgebraMerge):
             return Integer(1)
 
 
+@plugin_class_loading(get_path(r"template/algebraicfactory"))
 class AlgebraSymbol(__AlgebraInit):
     def del_symbol(self, x):
         del self.symbol_describe[x]
@@ -277,6 +285,7 @@ class AlgebraSymbol(__AlgebraInit):
         return establish_forecast + no_prediction
 
 
+@plugin_class_loading(get_path(r"template/algebraicfactory"))
 class AlgebraExp(AlgebraPrint):
     def add_expression(self, name, alg):  # 添加表达式
         try:
@@ -304,6 +313,7 @@ class AlgebraExp(AlgebraPrint):
         return self.print_expression_core(self.get_expression(name), level, first)
 
 
+@plugin_class_loading(get_path(r"template/algebraicfactory"))
 class AlgebraPolynomialSplit(AlgebraSplit):
     def split_mul(self, name, return_num=False, return_one=False):
         exp = self.get_expression(name)
@@ -364,6 +374,7 @@ class AlgebraPolynomialSplit(AlgebraSplit):
         return get, alg
 
 
+@plugin_class_loading(get_path(r"template/algebraicfactory"))
 class AlgebraPolynomialMerge(AlgebraMerge):
     def merge_add(self, name_list):
         exp = []
@@ -394,6 +405,7 @@ class AlgebraPolynomialMerge(AlgebraMerge):
         return self.merge_func_core(name, func)
 
 
+@plugin_class_loading(get_path(r"template/algebraicfactory"))
 class Fractional(AlgebraBase):
     def fractional_merge(self, name):  # 最小公分母合并
         alg = self.get_expression(name)
@@ -419,6 +431,7 @@ class Fractional(AlgebraBase):
         return radsimp(alg, rationalized_unknown, maximum_irrational_term)
 
 
+@plugin_class_loading(get_path(r"template/algebraicfactory"))
 class Trig(AlgebraBase):
     def trig_simp(self, name):  # 三角化简
         alg = self.get_expression(name)
@@ -429,6 +442,7 @@ class Trig(AlgebraBase):
         return expand_trig(alg, deep)
 
 
+@plugin_class_loading(get_path(r"template/algebraicfactory"))
 class AlgebraMul(AlgebraBase):
     def mul_expansion(self, name):
         alg = self.get_expression(name)
@@ -482,6 +496,7 @@ class AlgebraMul(AlgebraBase):
         return expand_log(alg, deep, keep_assumptions)
 
 
+@plugin_class_loading(get_path(r"template/algebraicfactory"))
 class General(AlgebraBase):
     def expansion(self, name, is_expand_complex):
         alg = self.get_expression(name)
@@ -504,18 +519,21 @@ class General(AlgebraBase):
             return ceiling(alg)
 
 
+@plugin_class_loading(get_path(r"template/algebraicfactory"))
 class AlgebraComplex(AlgebraBase):
     def expand_complex(self, name):
         alg = self.get_expression(name)
         return expand_complex(alg)
 
 
+@plugin_class_loading(get_path(r"template/algebraicfactory"))
 class AlgebraSpecialFunc(AlgebraBase):
     def expand_special(self, name):
         alg = self.get_expression(name)
         return expand_func(alg)
 
 
+@plugin_class_loading(get_path(r"template/algebraicfactory"))
 class Simultaneous(AlgebraBase):
     def value_algebraic_simultaneous(self, name, simultaneous_dict):
         alg = self.get_expression(name)
@@ -553,6 +571,7 @@ class Simultaneous(AlgebraBase):
         return alg.subs(sympy_dict)
 
 
+@plugin_class_loading(get_path(r"template/algebraicfactory"))
 class Sloving(AlgebraBase):
     def solving_equations(self, equation_set):
         alg = []
@@ -585,18 +604,21 @@ class Sloving(AlgebraBase):
         return get
 
 
+@plugin_class_loading(get_path(r"template/algebraicfactory"))
 class Digitization(AlgebraBase):
     def algebraic_digitization(self, name, n):
         alg = self.get_expression(name)
         return alg.evalf(n)
 
 
+@plugin_class_loading(get_path(r"template/algebraicfactory"))
 class AlgebraSimplify(AlgebraBase):
     def simplify(self, name, ratdio=1.7, func=None, rat=True, inv=False):
         alg = self.get_expression(name)
         self.simplify(alg, ratdio, func, rat, inv)
 
 
+@plugin_class_loading(get_path(r"template/algebraicfactory"))
 class Rewrite(AlgebraBase):
     def rewrite_exp(self, name, rewrite_func, rewrite_object, deep=False):
         alg = self.get_expression(name)
@@ -610,6 +632,7 @@ class Rewrite(AlgebraBase):
             return alg.rewrite(initial_object, deep=deep)
 
 
+@plugin_class_loading(get_path(r"template/algebraicfactory"))
 class AlgebraPlot(AlgebraBase):
     def plot(self, name, list_2d, list_3d=None):
         list_2d = list_2d.copy()
@@ -639,6 +662,7 @@ class AlgebraPlot(AlgebraBase):
             )
 
 
+@plugin_func_loading(get_path(r"template/algebraicfactory"))
 def interpreter(word: str):
     book = {
         "algebraic": "代数",

+ 27 - 0
crawler/template.py

@@ -14,6 +14,7 @@ import requests
 from crawler import db
 from crawler.controller import Url, PageDownloader
 from crawler.db import CoTanDB
+from system import plugin_class_loading, get_path
 
 keys_name_dict = {
     "ctrl": Keys.CONTROL,
@@ -158,6 +159,7 @@ class Urlbase:
         self.filter = {}  # 过滤函数
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class UrlFile(Urlbase):
     def close(self):
         self.file.close()
@@ -172,6 +174,7 @@ class UrlFile(Urlbase):
         self.file_run.flush()
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class UrlPost(__RequestsBase):  # 通过requests的post请求
     def __init__(self, url, data, time_out, user_agent="", cookies=None, **kwargs):
         super(UrlPost, self).__init__(time_out)
@@ -184,6 +187,7 @@ class UrlPost(__RequestsBase):  # 通过requests的post请求
         return super(UrlPost, self).__str__() + f";data>{self.data}"
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class UrlGet(__RequestsBase):  # 通过requests的post请求
     def __init__(self, url, time_out, user_agent="", cookies=None, **kwargs):
         super(UrlGet, self).__init__(time_out)
@@ -192,6 +196,7 @@ class UrlGet(__RequestsBase):  # 通过requests的post请求
         self.init(user_agent, url, cookies)
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class UrlPage(PageBase):
     def __init__(
         self,
@@ -250,6 +255,7 @@ class UrlPage(PageBase):
         return f"{self.mode}-{self.url}:UA>{self.user_agent}"
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class UrlAdd(UrlFile):
     def filter_func(self, url, **kwargs):  # url过滤系统
         for i in self.filter:
@@ -293,6 +299,7 @@ class UrlAdd(UrlFile):
         return False  # 写入失败
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class UrlReturn(UrlFile):
     def del_url(self, index):  # 删除url
         self.out_url_run(f"DELETE {self.url_list[index]}")
@@ -339,6 +346,7 @@ class PagedownloaderBase(SeleniumBase, RequestsBase, metaclass=ABCMeta):
         self.parser = parser
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class PageDownloaderRun(PagedownloaderBase):
     def close(self):
         self.log.close()
@@ -370,6 +378,7 @@ class PageDownloaderRun(PagedownloaderBase):
         return self.browser
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class PageDownloaderCookies(PageDownloaderRun):
     def monitoring_del_cookies(self, name):  # 删除指定cookies
         self.browser.delete_cookie(name)
@@ -391,6 +400,7 @@ class PageDownloaderCookies(PageDownloaderRun):
         raise Exception
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class PageDownloaderRequests(PageDownloaderCookies):
     def requests_start_cookies(self, func_cookie, url):
         self.cookie_dict[url] = requests.utils.dict_from_cookiejar(
@@ -428,6 +438,7 @@ class PageDownloaderRequests(PageDownloaderCookies):
         self.requests_start_cookies(func_cookie, url)
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class PageDownloaderSelenium(PageDownloaderCookies):
 
     def selenium_quit(self):
@@ -516,6 +527,7 @@ class PageParserBase:
         return wrap
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class PageParserFunc(PageParserBase):
     def tra_func(self):
         self.func_list = []
@@ -543,6 +555,7 @@ class PageParserFunc(PageParserBase):
             ]
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class PageParserFind(PageParserFunc):
     def find_id(self, id, not_all=False, **kwargs):
         @self.add_base
@@ -708,6 +721,7 @@ class PageParserFind(PageParserFunc):
         self.add_func(f"find_frame:{func_name}", find)  # 添加func
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class PageParserActionListBox(PageParserFunc):
     def deselect_by_index(
         self, element_value, deselect, index=0, **kwargs
@@ -776,6 +790,7 @@ class PageParserActionListBox(PageParserFunc):
         )  # 添加func
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class PageParserAction(PageParserActionListBox):
     def send_keys(self, text, element_value, index=0, **kwargs):  # 输入文字
         @self.add_base
@@ -850,6 +865,7 @@ class PageParserAction(PageParserActionListBox):
         self.add_func(f"run_js:{js}", action)
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class PageParserBrowserCookies(PageParserFunc):
     def del_all_cookies(self, **kwargs):  # 删除所有曲奇
         @self.add_base
@@ -905,6 +921,7 @@ class PageParserBrowserCookies(PageParserFunc):
         self.add_func(f"get_all_cookies", action)
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class PageParserBrowser(PageParserBrowserCookies):
     def back(self, **kwargs):  # 返回
         @self.add_base
@@ -947,6 +964,7 @@ class PageParserBrowser(PageParserBrowserCookies):
         self.add_func(f"Loading_wait:{time}s", action)
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class PageParserNeighbor(PageParserFunc):
     def __get_other_base(
         self, element_value, index: (slice, int), who="children", **kwargs
@@ -987,6 +1005,7 @@ class PageParserNeighbor(PageParserFunc):
         return self.__get_other_base(element_value, index, "brothers")
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class PageParserDataFindall(PageParserFunc):
     def findall(
         self,
@@ -1072,6 +1091,7 @@ class PageParserDataFindall(PageParserFunc):
         self.add_func(f"findAll_by_text:{element_value}[{index}]", action)  # 添加func
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class PageParserDatabase(PageParserFunc):
     def to_database(
         self, element_value, index, data: (str, list), database_name: str, **kwargs
@@ -1117,6 +1137,7 @@ class PageParserDatabase(PageParserFunc):
         )  # 添加func
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class PageParserDataSource(PageParserFunc):
     def to_text(self, **kwargs):  # 获取网页源码
         @self.add_base
@@ -1202,6 +1223,7 @@ class PageParserDataSource(PageParserFunc):
         self.add_func(f"to_json", action)  # 添加func
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class PageParserData(PageParserNeighbor, PageParserDataFindall, PageParserDatabase,
                      PageParserDataSource):
 
@@ -1246,6 +1268,7 @@ class PageParserData(PageParserNeighbor, PageParserDataFindall, PageParserDataba
         self.add_func(f"Webpage_snapshot", action)  # 添加func
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class PageParserChainsWindow(PageParserFunc):
     def get_all_windows(self, *args, **kwargs):  # 获取所有句柄
         @self.add_base
@@ -1275,6 +1298,7 @@ class PageParserChainsWindow(PageParserFunc):
         self.add_func(f"switch_to_window>{element_value}[{index}]", action)  # 添加func
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class PageParserClick(PageParserFunc):
     def action_click(self, chains, element_value, index, **kwargs):  # 单击左
         @self.add_base
@@ -1321,6 +1345,7 @@ class PageParserClick(PageParserFunc):
         )  # 添加func
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class PageParserChainsMouse(PageParserFunc):
     def action_release(self, chains, element_value, index, **kwargs):  # 松开左键
         @self.add_base
@@ -1360,6 +1385,7 @@ class PageParserChainsMouse(PageParserFunc):
         )  # 添加func
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class PageParserChainsKeys(PageParserFunc):
     def special_keys(self, key: str, is_special_keys):
         if is_special_keys:
@@ -1426,6 +1452,7 @@ class PageParserChainsKeys(PageParserFunc):
         self.add_func(f"[{chains}].sent>{key}", action)  # 添加func
 
 
+@plugin_class_loading(get_path(r'template/crawler'))
 class PageParserChains(PageParserChainsWindow, PageParserClick, PageParserChainsMouse,
                        PageParserChainsKeys):
     def make_action_chains(self, **kwargs):  # 创建动作链

+ 26 - 2
datascience/template.py

@@ -17,6 +17,7 @@ import pandas_profiling as pp
 
 from pyecharts.globals import CurrentConfig
 from pyecharts.globals import GeoType  # 地图推荐使用GeoType而不是str
+from system import plugin_class_loading, get_path
 
 CurrentConfig.ONLINE_HOST = f"{getcwd()}/assets/"
 
@@ -48,6 +49,7 @@ class FormBase(RowColumnBase):
         self.all_render = {}  # 存放所有的图
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class SheetIO(FormBase):
 
     def add_sheet(self, data, name=""):
@@ -128,6 +130,7 @@ class SheetIO(FormBase):
         get.to_csv(save_dir, sep=sep, na_rep="")
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class SheetRender(SheetIO):
     def render_html_one(self, name, render_dir=""):
         if render_dir == "":
@@ -206,6 +209,7 @@ class SheetRender(SheetIO):
         return tab_render_dir
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class SheetReport(SheetIO):
     def describe(self, name, new=False):  # 生成描述
         get = self.get_sheet(name)
@@ -234,6 +238,7 @@ class SheetReport(SheetIO):
         return save_dir
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class Rename(SheetIO):
     def number_naming(self, name, is_column, save):
         get = self.get_sheet(name).copy()
@@ -302,6 +307,7 @@ class Rename(SheetIO):
         return get
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class Sorted(SheetIO):
     def sorted_index(self, name, row: bool, new=False, a=True):
         get = self.get_sheet(name)
@@ -330,6 +336,7 @@ class Sorted(SheetIO):
         return sorted_sheet
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class RowColumn(Rename, Sorted):
     def get_column(self, name, only=False):  # 列名
         get = self.get_sheet(name)
@@ -403,6 +410,7 @@ class RowColumn(Rename, Sorted):
         return get
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class SheetSlice(SheetIO):
     def get_slice(
         self, name, column, row, is_iloc=True, new=False
@@ -435,6 +443,7 @@ class SheetSlice(SheetIO):
         return new_sheet
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class DatacleaningFunc(SheetIO):
     def add_clean_func(self, code):
         name = self.Name.copy()
@@ -527,6 +536,7 @@ class DatacleaningFunc(SheetIO):
         return get
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class SheetDtype(SheetIO):
     def set_dtype(self, name, column, dtype, wrong):
         get = self.get_sheet(name).copy()
@@ -580,6 +590,7 @@ class SheetDtype(SheetIO):
         return get
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class DataNan(SheetIO):
     def is_nan(self, name):
         get = self.get_sheet(name)
@@ -594,6 +605,7 @@ class DataNan(SheetIO):
         return clean_sheet
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class BoolSheet(SheetIO):
     def to_bool(self, name, exp, new=False):
         get = self.get_sheet(name)
@@ -606,6 +618,7 @@ class BoolSheet(SheetIO):
             return None
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class DataSample(SheetIO):
     def sample(self, name, new):
         get = self.get_sheet(name)
@@ -615,6 +628,7 @@ class DataSample(SheetIO):
         return sample
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class DataTranspose(SheetIO):
     def transpose(self, name, new=True):
         get = self.get_sheet(name)
@@ -624,6 +638,7 @@ class DataTranspose(SheetIO):
         return t
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class DataFormBase(SheetRender, SheetReport, RowColumn, SheetSlice, DatacleaningFunc, SheetDtype, DataNan, BoolSheet,
                    DataSample, DataTranspose):
 
@@ -639,6 +654,7 @@ class DataFormBase(SheetRender, SheetReport, RowColumn, SheetSlice, Datacleaning
         del self.sheet_dict[name]
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class PlotBase(DataFormBase):
     def parsing_parameters(self, text):  # 解析文本参数
         args = {}  # 解析到的参数
@@ -909,6 +925,7 @@ class PlotBase(DataFormBase):
         return k
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class Render(PlotBase):
     def render_all(self, text, render_dir) -> Page:
         args = self.parsing_parameters(text)
@@ -945,6 +962,7 @@ class Render(PlotBase):
         return color
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class AxisPlot(Render):
     def to_bar(self, name, text) -> Bar:  # Bar:数据堆叠
         get = self.get_sheet(name)
@@ -1146,6 +1164,7 @@ class AxisPlot(Render):
         return c
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class GeneralPlot(Render):
     def to_format_graph(self, name, text) -> Graph:
         get = self.get_sheet(name)
@@ -1493,6 +1512,7 @@ class GeneralPlot(Render):
         return c
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class RelationshipPlot(Render):
     def to_sunburst(self, name, text) -> Sunburst:
         get = self.get_sheet(name)
@@ -1681,6 +1701,7 @@ class RelationshipPlot(Render):
         return c
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class GeographyPlot(Render):
     def to_map(self, name, text) -> Map:
         get = self.get_sheet(name)
@@ -1816,6 +1837,7 @@ class GeographyPlot(Render):
         return c
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class WordPlot(Render):
     def to_word_cloud(self, name, text) -> WordCloud:
         get = self.get_sheet(name)
@@ -1875,6 +1897,7 @@ class WordPlot(Render):
         return c
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class SolidPlot(Render):
     def to_bar3d(self, name, text) -> Bar3D:
         get = self.get_sheet(name)
@@ -1988,6 +2011,7 @@ class SolidPlot(Render):
         return c
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class Plot(AxisPlot, GeneralPlot, RelationshipPlot, GeographyPlot, WordPlot, SolidPlot):
     def custom_graph(self, text):
         named_domain = {}
@@ -2042,6 +2066,7 @@ class MachineLearnerBase(Plot):
         return self.learner_type[name]
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class VisualLearner(MachineLearnerBase):
     def visual_learner(self, learner, new=False):  # 显示参数
         learner = self.get_learner(learner)
@@ -2104,6 +2129,7 @@ class VisualLearner(MachineLearnerBase):
         return doc, data
 
 
+@plugin_class_loading(get_path(r'template/datascience'))
 class Learner(MachineLearnerBase):
     def decision_tree_classifier(self, name):  # 特征提取
         get = self.get_sheet(name)
@@ -2189,5 +2215,3 @@ class Learner(MachineLearnerBase):
             return self.predict_simp(
                 name, learner, down_ndim=args_use["nDim_2"], **kwargs
             )
-
-

+ 16 - 1
funcsystem/template.py

@@ -7,7 +7,10 @@ import tkinter.messagebox
 import pandas
 import sympy
 
+from system import plugin_class_loading, get_path, plugin_func_loading
 
+
+@plugin_func_loading(get_path(r'template/funcsystem'))
 def to_bool(str_object, hope=False):
     false_list = ["0", "n", "no", "NO", "NOT", "No", "Not", "不"]
     true_list = ["y", "yes", "Yes", "YES", "不"]
@@ -27,6 +30,7 @@ def to_bool(str_object, hope=False):
         return bool(str_object)
 
 
+@plugin_func_loading(get_path(r'template/funcsystem'))
 def find_x_by_y(x_list, y_list, y):  # 输入x和y照除In_Y的所有对应x值
     m = []
     while True:
@@ -231,6 +235,7 @@ class SheetFuncInit:
         return f"{self.func_name}"
 
 
+@plugin_class_loading(get_path(r'template/funcsystem'))
 class SheetDataPacket(SheetFuncInit, metaclass=ABCMeta):
     @abstractmethod
     def best_value_core(self):
@@ -318,6 +323,7 @@ class SheetDataPacket(SheetFuncInit, metaclass=ABCMeta):
         return self.x, self.y, self.func_name, self.style
 
 
+@plugin_class_loading(get_path(r'template/funcsystem'))
 class SheetBestValue(SheetDataPacket):
     def best_value_core(self):  # 计算最值和极值点
         if not self.have_data_packet:
@@ -340,6 +346,7 @@ class SheetBestValue(SheetDataPacket):
         return self.max_x, self.max_y, self.min_x, self.min_y
 
 
+@plugin_class_loading(get_path(r'template/funcsystem'))
 class SheetComputing(SheetBestValue):
     def gradient_calculation(self, y_in, *args, **kwargs):  # 保持和下一个对象相同参数
         result = self.dichotomy(y_in)
@@ -401,6 +408,7 @@ class SheetComputing(SheetBestValue):
         return answer
 
 
+@plugin_class_loading(get_path(r'template/funcsystem'))
 class SheetProperty(SheetComputing):
     def parity(self, *args, **kwargs):  # 奇偶性
         if not self.have_data_packet:
@@ -523,7 +531,6 @@ class SheetProperty(SheetComputing):
             answer.append(f"对称中心:{center_of_symmetry}")
         return answer
 
-
     def periodic(self, output_prompt=lambda x: x, **kwargs):  # 计算周期
         if not tkinter.messagebox.askokcancel("提示", f"计算周期需要一定时间,是否执行?(计算过程程序可能无响应)"):
             return None, []  # 无结果
@@ -658,6 +665,7 @@ class SheetProperty(SheetComputing):
             return None, []  # 无结果
 
 
+@plugin_class_loading(get_path(r'template/funcsystem'))
 class SheetMemory(SheetFuncInit):
     def hide_or_show(self):
         if self.have_prediction:
@@ -801,6 +809,7 @@ class ExpFuncInit:
         return f"{self.func_name} {self.start, self.end, self.span}"
 
 
+@plugin_class_loading(get_path(r'template/funcsystem'))
 class ExpDataPacket(ExpFuncInit, metaclass=ABCMeta):
     @abstractmethod
     def best_value_core(self):
@@ -907,6 +916,7 @@ class ExpDataPacket(ExpFuncInit, metaclass=ABCMeta):
         return self.x, self.y, self.func_name, self.style
 
 
+@plugin_class_loading(get_path(r'template/funcsystem'))
 class ExpBestValue(ExpDataPacket):
     def best_value_core(self):  # 计算最值和极值点
         # 使用ya解决了因计算器误差而没计算到的最值,但是同时本不是最值的与最值相近的数字也被当为了最值,所以使用群组击破
@@ -993,6 +1003,7 @@ class ExpBestValue(ExpDataPacket):
         return self.max_x, self.max_y, self.min_x, self.min_y
 
 
+@plugin_class_loading(get_path(r'template/funcsystem'))
 class ExpComputing(ExpBestValue):
 
     def sympy_calculation(self, y_value):  # 利用Sympy解方程
@@ -1316,6 +1327,7 @@ class ExpComputing(ExpBestValue):
         return answer, derivative_num
 
 
+@plugin_class_loading(get_path(r'template/funcsystem'))
 class ExpProperty(ExpComputing):
     def parity(self, precision=False):  # 启动round处理
         if not self.have_data_packet:
@@ -1625,6 +1637,7 @@ class ExpProperty(ExpComputing):
             return None, []  # 无结果
 
 
+@plugin_class_loading(get_path(r'template/funcsystem'))
 class ExpCheck(ExpFuncInit):
     def check_monotonic(
         self, parameters, output_prompt=lambda x: x, accuracy=None
@@ -1756,6 +1769,7 @@ class ExpCheck(ExpFuncInit):
         return result, f"{self}的对称中心{result_key[result]}{parameters}"
 
 
+@plugin_class_loading(get_path(r'template/funcsystem'))
 class ExpMemory(ExpFuncInit):
     def hide_or_show(self):  # 记忆数据显示和隐藏
         if self.have_prediction:
@@ -1778,6 +1792,7 @@ class ExpMemory(ExpFuncInit):
         return self.memore_x, self.memore_y
 
 
+@plugin_class_loading(get_path(r'template/funcsystem'))
 class ExpFuncSon:
     def __init__(
         self, func, style, start=-10, end=10, span=0.1, accuracy=2, a_default=1

+ 10 - 0
gitrepo/template.py

@@ -6,6 +6,8 @@ from git import Repo
 from os.path import exists, split
 from time import time
 
+from system import plugin_class_loading, get_path
+
 sys_seeting = dict(
     shell=True,
     stdin=subprocess.PIPE,
@@ -51,6 +53,7 @@ class GitBase(metaclass=ABCMeta):
         return file
 
 
+@plugin_class_loading(get_path(r'template/gitrepo'))
 class ViewClasses(GitBase):
 
     def status(self):  # 执行status
@@ -138,6 +141,7 @@ class ViewClasses(GitBase):
         )
 
 
+@plugin_class_loading(get_path(r'template/gitrepo'))
 class NewClasses(GitBase):
     def add(self, file_list):
         file = self.get_flie_list(file_list)
@@ -205,6 +209,7 @@ class NewClasses(GitBase):
         )
 
 
+@plugin_class_loading(get_path(r'template/gitrepo'))
 class RemoveClass(GitBase):
     def del_cached_file(self, file_list):
         file = self.get_flie_list(file_list)
@@ -266,6 +271,7 @@ class RemoveClass(GitBase):
         )
 
 
+@plugin_class_loading(get_path(r'template/gitrepo'))
 class BackClasses(GitBase):
     def reset(self, head="HEAD~1", reset_type=0):
         if reset_type == 0:
@@ -317,6 +323,7 @@ class BackClasses(GitBase):
         )
 
 
+@plugin_class_loading(get_path(r'template/gitrepo'))
 class ParallelClasses(GitBase):
     def switch_branch(self, branch_name):  # 切换分支
         return subprocess.Popen(
@@ -351,6 +358,7 @@ class ParallelClasses(GitBase):
         )
 
 
+@plugin_class_loading(get_path(r'template/gitrepo'))
 class RemoteClasses(GitBase):
     def push_tag(self, tag, remote_name):
         return subprocess.Popen(
@@ -458,6 +466,7 @@ class RemoteClasses(GitBase):
         )
 
 
+@plugin_class_loading(get_path(r'template/gitrepo'))
 class GitRepo(ViewClasses, NewClasses, RemoveClass, BackClasses, ParallelClasses, RemoteClasses):  # git的基类
 
     def init(self, repo_dir):
@@ -494,6 +503,7 @@ class GitRepo(ViewClasses, NewClasses, RemoveClass, BackClasses, ParallelClasses
         return self.repo_dir + inside + dir
 
 
+@plugin_class_loading(get_path(r'template/gitrepo'))
 class CloneGit(GitRepo):  # Clone一个git
     def init(self, repo_dir, *args, **kwargs):
         self.Repo_Dic = repo_dir  # 仓库地址

+ 79 - 9
machinelearning/template.py

@@ -4,7 +4,13 @@ import tarfile
 from abc import ABCMeta, abstractmethod
 from os import getcwd, mkdir
 from os.path import split as path_split, splitext, basename, exists
-from sklearn.feature_selection import chi2, f_classif, mutual_info_classif, f_regression, mutual_info_regression
+from sklearn.feature_selection import (
+    chi2,
+    f_classif,
+    mutual_info_classif,
+    f_regression,
+    mutual_info_regression,
+)
 
 from sklearn.svm import SVC, SVR  # SVC是svm分类,SVR是svm回归
 from sklearn.cluster import KMeans, AgglomerativeClustering, DBSCAN
@@ -40,6 +46,7 @@ from pyecharts import options as opts
 from pyecharts.components import Image
 from pyecharts.globals import CurrentConfig
 
+from system import plugin_class_loading, get_path, plugin_func_loading
 
 CurrentConfig.ONLINE_HOST = f"{getcwd()}/assets/"
 
@@ -108,6 +115,7 @@ class LearnBase:
         return self.numpy_dict[name].copy()
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class LearnerIO(LearnBase):
     def add_form(self, data: np.array, name):
         name = f"{name}[{len(self.numpy_dict)}]"
@@ -222,6 +230,7 @@ class LearnerIO(LearnBase):
         return html_dir
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class LearnerMerge(LearnerIO):
     def merge(self, name, axis=0):  # aiis:0-横向合并(hstack),1-纵向合并(vstack),2-深度合并
         sheet_list = []
@@ -231,6 +240,7 @@ class LearnerMerge(LearnerIO):
         self.add_form(np.array(get), f"{name[0]}合成")
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class LearnerSplit(LearnerIO):
     def split(self, name, split=2, axis=0):  # aiis:0-横向分割(hsplit),1-纵向分割(vsplit)
         sheet = self.get_sheet(name)
@@ -253,6 +263,7 @@ class LearnerSplit(LearnerIO):
             self.add_form(sheet[:, :split], f"{name[0]}分割")
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class LearnerDimensions(LearnerIO):
     def deep(self, sheet: np.ndarray):
         return sheet.ravel()
@@ -283,6 +294,7 @@ class LearnerDimensions(LearnerIO):
         self.add_form(np.squeeze(sheet), f"{name}降维")
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class LearnerShape(LearnerIO):
     def transpose(self, name, func: list):
         sheet = self.get_sheet(name)
@@ -296,8 +308,8 @@ class LearnerShape(LearnerIO):
         self.add_form(sheet.reshape(shape).copy(), f"{name}.r")
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class Learner(LearnerMerge, LearnerSplit, LearnerDimensions, LearnerShape):
-
     def calculation_matrix(self, data, data_type, func):
         if 1 not in data_type:
             raise Exception
@@ -387,8 +399,8 @@ class Machinebase(metaclass=ABCMeta):
         pass
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class StudyMachinebase(Machinebase):
-
     def fit_model(self, x_data, y_data, split=0.3, increment=True, **kwargs):
         y_data = y_data.ravel()
         try:
@@ -666,6 +678,7 @@ class UnsupervisedModel(PrepBase):  # 无监督
         return "None", "None"
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class ToPyebase(StudyMachinebase):
     def __init__(self, model, *args, **kwargs):
         super(ToPyebase, self).__init__(*args, **kwargs)
@@ -829,7 +842,7 @@ class ViewData(ToPyebase):  # 绘制预测型热力图
         return y_traindata, "y训练数据"
 
     def data_visualization(self, save_dir, *args, **kwargs):
-        return (save_dir,)
+        return save_dir,
 
 
 class MatrixScatter(ToPyebase):  # 矩阵散点图
@@ -1117,6 +1130,7 @@ class PredictiveHeatmapMore(PredictiveHeatmapBase):  # 绘制预测型热力图_
         )
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class NearFeatureScatterClassMore(ToPyebase):
     def data_visualization(self, save_dir, *args, **kwargs):
         tab = Tab()
@@ -1141,6 +1155,7 @@ class NearFeatureScatterClassMore(ToPyebase):
         return save,
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class NearFeatureScatterMore(ToPyebase):
     def data_visualization(self, save_dir, *args, **kwargs):
         tab = Tab()
@@ -1220,6 +1235,7 @@ class FeatureScatterYX(ToPyebase):  # y-x图
         return save,
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class LineModel(StudyMachinebase):
     def __init__(
         self, args_use, model, *args, **kwargs
@@ -1230,7 +1246,9 @@ class LineModel(StudyMachinebase):
             self.model = all_model()
             self.k = {}
         else:
-            self.model = all_model(alpha=args_use["alpha"], max_iter=args_use["max_iter"])
+            self.model = all_model(
+                alpha=args_use["alpha"], max_iter=args_use["max_iter"]
+            )
             self.k = {"alpha": args_use["alpha"], "max_iter": args_use["max_iter"]}
         # 记录这两个是为了克隆
         self.Alpha = args_use["alpha"]
@@ -1282,6 +1300,7 @@ class LineModel(StudyMachinebase):
         return save,
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class LogisticregressionModel(StudyMachinebase):
     def __init__(
         self, args_use, model, *args, **kwargs
@@ -1395,12 +1414,15 @@ class CategoricalData:  # 数据统计助手
         return self.x_means, self.x_range, self.data_type
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class KnnModel(StudyMachinebase):
     def __init__(
         self, args_use, model, *args, **kwargs
     ):  # model表示当前选用的模型类型,Alpha针对正则化的参数
         super(KnnModel, self).__init__(*args, **kwargs)
-        all_model = {"Knn_class": KNeighborsClassifier, "Knn": KNeighborsRegressor}[model]
+        all_model = {"Knn_class": KNeighborsClassifier, "Knn": KNeighborsRegressor}[
+            model
+        ]
         self.model = all_model(p=args_use["p"], n_neighbors=args_use["n_neighbors"])
         # 记录这两个是为了克隆
         self.n_neighbors = args_use["n_neighbors"]
@@ -1463,14 +1485,16 @@ class KnnModel(StudyMachinebase):
         return save,
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class TreeModel(StudyMachinebase):
     def __init__(
         self, args_use, model, *args, **kwargs
     ):  # model表示当前选用的模型类型,Alpha针对正则化的参数
         super(TreeModel, self).__init__(*args, **kwargs)
-        all_model = {"Tree_class": DecisionTreeClassifier, "Tree": DecisionTreeRegressor}[
-            model
-        ]
+        all_model = {
+            "Tree_class": DecisionTreeClassifier,
+            "Tree": DecisionTreeRegressor,
+        }[model]
         self.model = all_model(
             criterion=args_use["criterion"],
             splitter=args_use["splitter"],
@@ -1570,6 +1594,7 @@ class TreeModel(StudyMachinebase):
         return save,
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class ForestModel(StudyMachinebase):
     def __init__(
         self, args_use, model, *args, **kwargs
@@ -1748,6 +1773,7 @@ class GradienttreeModel(StudyMachinebase):  # 继承Tree_Model主要是继承Des
         return save,
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class SvcModel(StudyMachinebase):
     def __init__(
         self, args_use, model, *args, **kwargs
@@ -1822,6 +1848,7 @@ class SvcModel(StudyMachinebase):
         return save,
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class SvrModel(StudyMachinebase):
     def __init__(
         self, args_use, model, *args, **kwargs
@@ -2630,6 +2657,7 @@ class MissedModel(Unsupervised):  # 缺失数据补充
         return save,
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class PcaModel(Unsupervised):
     def __init__(self, args_use, *args, **kwargs):
         super(PcaModel, self).__init__(*args, **kwargs)
@@ -2702,6 +2730,7 @@ class PcaModel(Unsupervised):
         return save,
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class RpcaModel(Unsupervised):
     def __init__(self, args_use, *args, **kwargs):
         super(RpcaModel, self).__init__(*args, **kwargs)
@@ -2772,6 +2801,7 @@ class RpcaModel(Unsupervised):
         return save,
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class KpcaModel(Unsupervised):
     def __init__(self, args_use, *args, **kwargs):
         super(KpcaModel, self).__init__(*args, **kwargs)
@@ -2840,6 +2870,7 @@ class LdaModel(PrepBase):  # 有监督学习
         return save,
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class NmfModel(Unsupervised):
     def __init__(self, args_use, *args, **kwargs):
         super(NmfModel, self).__init__(*args, **kwargs)
@@ -2916,6 +2947,7 @@ class NmfModel(Unsupervised):
         return save,
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class TsneModel(Unsupervised):
     def __init__(self, args_use, *args, **kwargs):
         super(TsneModel, self).__init__(*args, **kwargs)
@@ -3039,6 +3071,7 @@ class MlpModel(StudyMachinebase):  # 神经网络(多层感知机),有监督
         return save,
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class KmeansModel(UnsupervisedModel):
     def __init__(self, args_use, *args, **kwargs):
         super(KmeansModel, self).__init__(*args, **kwargs)
@@ -3098,6 +3131,7 @@ class KmeansModel(UnsupervisedModel):
         return save,
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class AgglomerativeModel(UnsupervisedModel):
     def __init__(self, args_use, *args, **kwargs):
         super(AgglomerativeModel, self).__init__(*args, **kwargs)
@@ -3170,6 +3204,7 @@ class AgglomerativeModel(UnsupervisedModel):
         return save,
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class DbscanModel(UnsupervisedModel):
     def __init__(self, args_use, *args, **kwargs):
         super(DbscanModel, self).__init__(*args, **kwargs)
@@ -3406,6 +3441,7 @@ class CurveFitting(StudyMachinebase):  # 曲线拟合
 
         named_domain = {"np": np, "Func": model, "ndimDown": ndim_down}
         protection_func = f"""
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def FUNC({",".join(model.__code__.co_varnames)}):
     answer = Func({",".join(model.__code__.co_varnames)})
     return ndimDown(answer)
@@ -3478,6 +3514,7 @@ def FUNC({",".join(model.__code__.co_varnames)}):
         return save,
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class Tab(tab_First):
     def __init__(self, *args, **kwargs):
         super(Tab, self).__init__(*args, **kwargs)
@@ -3501,6 +3538,7 @@ class Tab(tab_First):
         return super(Tab, self).render(path, template_name, *args, **kwargs)
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class Table(TableFisrt):
     def __init__(self, *args, **kwargs):
         super(Table, self).__init__(*args, **kwargs)
@@ -3532,6 +3570,7 @@ class Table(TableFisrt):
         return super().render(path, *args, **kwargs)
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def make_list(first, end, num=35):
     n = num / (end - first)
     if n == 0:
@@ -3546,6 +3585,7 @@ def make_list(first, end, num=35):
     return re
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def list_filter(original_list, num=70):
     if len(original_list) <= num:
         return original_list
@@ -3554,6 +3594,7 @@ def list_filter(original_list, num=70):
     return re
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def prediction_boundary(x_range, x_means, predict_func, data_type):  # 绘制回归型x-x热力图
     # r是绘图大小列表,x_means是其余值,Predict_Func是预测方法回调
     # a-特征x,b-特征x-1,c-其他特征
@@ -3608,6 +3649,7 @@ def prediction_boundary(x_range, x_means, predict_func, data_type):  # 绘制回
     return render_list
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def prediction_boundary_more(x_range, x_means, predict_func, data_type):
     # r是绘图大小列表,x_means是其余值,Predict_Func是预测方法回调
     # a-特征x,b-特征x-1,c-其他特征
@@ -3837,6 +3879,7 @@ def decision_boundary_more(
     return render_list
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def see_tree(tree_file_dir):
     node_regex = re.compile(r'^([0-9]+) \[label="(.+)"\] ;$')  # 匹配节点正则表达式
     link_regex = re.compile("^([0-9]+) -> ([0-9]+) (.*);$")  # 匹配节点正则表达式
@@ -3890,10 +3933,12 @@ def see_tree(tree_file_dir):
     return c
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def make_tab(heard, row):
     return Table().add(headers=heard, rows=row)
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def coefficient_scatter_plot(w_heard, w):
     c = (
         Scatter()
@@ -3904,6 +3949,7 @@ def coefficient_scatter_plot(w_heard, w):
     return c
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def coefficient_bar_plot(w_heard, w):
     c = (
         Bar()
@@ -3914,6 +3960,7 @@ def coefficient_bar_plot(w_heard, w):
     return c
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def is_continuous(data: np.array, f: float = 0.1):
     data = data.tolist()
     l: list = np.unique(data).tolist()
@@ -3924,6 +3971,7 @@ def is_continuous(data: np.array, f: float = 0.1):
         return False
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def quick_stats(x_data):
     statistics_assistant = CategoricalData()
     print(x_data)
@@ -3933,6 +3981,7 @@ def quick_stats(x_data):
     return statistics_assistant
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def training_visualization_more_no_center(x_data, class_list, y_data):
     x_data = x_data.transpose()
     if len(x_data) == 1:
@@ -3984,6 +4033,7 @@ def training_visualization_more_no_center(x_data, class_list, y_data):
     return render_list, means, x_range, data_type
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def training_visualization_more(x_data, class_list, y_data, center):
     x_data = x_data.transpose()
     if len(x_data) == 1:
@@ -4064,6 +4114,7 @@ def training_visualization_more(x_data, class_list, y_data, center):
     return render_list, means, x_range, data_type
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def training_visualization_center(x_data, class_data, y_data, center):
     x_data = x_data.transpose()
     if len(x_data) == 1:
@@ -4140,6 +4191,7 @@ def training_visualization_center(x_data, class_data, y_data, center):
     return render_list, means, x_range, data_type
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def training_visualization(x_data, class_, y_data):  # 根据不同类别绘制x-x分类散点图
     x_data = x_data.transpose()
     if len(x_data) == 1:
@@ -4188,6 +4240,7 @@ def training_visualization(x_data, class_, y_data):  # 根据不同类别绘制x
     return render_list, means, x_range, data_type
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def training_visualization_no_class(x_data):  # 根据绘制x-x分类散点图(无类别)
     x_data = x_data.transpose()
     if len(x_data) == 1:
@@ -4297,6 +4350,7 @@ def training_w(
     return render_list
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def regress_w(x_data, w_data: np.array, intercept_b, x_means: list):  # 针对回归问题(y-x图)
     x_data = x_data.transpose()
     if len(x_data) == 1:
@@ -4338,6 +4392,7 @@ def regress_w(x_data, w_data: np.array, intercept_b, x_means: list):  # 针对
     return render_list
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def regress_visualization(x_data, y_data):  # y-x数据图
     x_data = x_data.transpose()
     y_is_continuous = is_continuous(y_data)
@@ -4383,6 +4438,7 @@ def regress_visualization(x_data, y_data):  # y-x数据图
     return render_list, means, x_range, data_type
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def feature_visualization(x_data, data_name=""):  # x-x数据图
     seeting = global_setting if data_name else global_not_legend
     x_data = x_data.transpose()
@@ -4423,6 +4479,7 @@ def feature_visualization(x_data, data_name=""):  # x-x数据图
     return render_list
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def feature_visualization_format(x_data, data_name=""):  # x-x数据图
     seeting = global_setting if data_name else global_not_legend
     x_data = x_data.transpose()
@@ -4469,6 +4526,7 @@ def feature_visualization_format(x_data, data_name=""):  # x-x数据图
     return render_list
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def discrete_feature_visualization(x_data, data_name=""):  # 必定离散x-x数据图
     seeting = global_setting if data_name else global_not_legend
     x_data = x_data.transpose()
@@ -4500,6 +4558,7 @@ def discrete_feature_visualization(x_data, data_name=""):  # 必定离散x-x数
     return render_list
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def conversion_control(y_data, x_data, tab):  # 合并两x-x图
     if isinstance(x_data, np.ndarray) and isinstance(y_data, np.ndarray):
         get_x = feature_visualization(x_data, "原数据")  # 原来
@@ -4509,6 +4568,7 @@ def conversion_control(y_data, x_data, tab):  # 合并两x-x图
     return tab
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def conversion_separate(y_data, x_data, tab):  # 并列显示两x-x图
     if isinstance(x_data, np.ndarray) and isinstance(y_data, np.ndarray):
         get_x = feature_visualization(x_data, "原数据")  # 原来
@@ -4525,6 +4585,7 @@ def conversion_separate(y_data, x_data, tab):  # 并列显示两x-x图
     return tab
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def conversion_separate_format(y_data, tab):  # 并列显示两x-x图
     if isinstance(y_data, np.ndarray):
         get_y = feature_visualization_format(y_data, "转换数据")  # 转换
@@ -4533,6 +4594,7 @@ def conversion_separate_format(y_data, tab):  # 并列显示两x-x图
     return tab
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def conversion_separate_wh(w_array, h_array, tab):  # 并列显示两x-x图
     if isinstance(w_array, np.ndarray) and isinstance(w_array, np.ndarray):
         get_x = feature_visualization_format(w_array, "W矩阵数据")  # 原来
@@ -4551,6 +4613,7 @@ def conversion_separate_wh(w_array, h_array, tab):  # 并列显示两x-x图
     return tab
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def make_bar(name, value, tab):  # 绘制柱状图
     c = (
         Bar()
@@ -4561,6 +4624,7 @@ def make_bar(name, value, tab):  # 绘制柱状图
     tab.add(c, name)
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def judging_digits(num: (int, float)):  # 查看小数位数
     a = str(abs(num)).split(".")[0]
     if a == "":
@@ -4568,6 +4632,7 @@ def judging_digits(num: (int, float)):  # 查看小数位数
     return len(a)
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def num_str(num, accuracy):
     num = str(round(float(num), accuracy))
     if len(num.replace(".", "")) == accuracy:
@@ -4579,6 +4644,7 @@ def num_str(num, accuracy):
         return num + "0" * (accuracy - len(num) + 1)  # len(num)多算了一位小数点
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def des_to_csv(save_dir, name, data, columns=None, row=None):
     save_dir = save_dir + "/" + name + ".csv"
     print(columns)
@@ -4592,6 +4658,7 @@ def des_to_csv(save_dir, name, data, columns=None, row=None):
     return data
 
 
+@plugin_func_loading(get_path(r'template/machinelearning'))
 def pack(output_filename, source_dir):
     with tarfile.open(output_filename, "w:gz") as tar:
         tar.add(source_dir, arcname=basename(source_dir))
@@ -4792,6 +4859,7 @@ class MachineLearnerInit(Learner):
         return self.data_type[name]
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class MachineLearnerAdd(MachineLearnerInit):
     def add_learner(self, learner_str, parameters=""):
         get = self.learn_dict[learner_str]
@@ -4846,6 +4914,7 @@ class MachineLearnerAdd(MachineLearnerInit):
         self.data_type[name] = "View_data"
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class MachineLearnerScore(MachineLearnerInit):
     def score(self, name_x, name_y, learner):  # Score_Only表示仅评分 Fit_Simp 是普遍类操作
         model = self.get_learner(learner)
@@ -4895,6 +4964,7 @@ class MachineLearnerScore(MachineLearnerInit):
         return save, new_dic
 
 
+@plugin_class_loading(get_path(r"template/machinelearning"))
 class LearnerActions(MachineLearnerInit):
     def fit_model(self, x_name, y_name, learner, split=0.3, *args, **kwargs):
         x_data = self.get_sheet(x_name)

+ 28 - 0
system/__init__.py

@@ -0,0 +1,28 @@
+import os
+
+PATH = os.getcwd()
+
+
+def get_path(name):
+    return f'{PATH}/{name}'
+
+
+def plugin_class_loading(template_path):
+    # 装饰器,装饰类的,允许使用自定义插件
+    def plugin_read(base):
+        name = base.__name__
+        template = f'{template_path}/template_{name}.py'
+        try:
+            if os.path.exists(template):
+                with open(template, 'r') as f:
+                    namespace = {'base': base}
+                    exec(f.read().replace('base = None', ''), namespace)
+                return namespace[name]
+            else:
+                raise Exception
+        except BaseException:
+            return base
+    return plugin_read
+
+
+plugin_func_loading = plugin_class_loading