在 Jupyter 中将类函数拆分到多个单元格中?

use*_*602 5 oop python-3.x jupyter jupyter-notebook

给出以下代码:

class DTC:
    def __init__(self):
        self.__root = None

    def unique(self,Y):
        d = {}
        for i in Y:
            if i not in d:
                d[i]=1
            else:
                d[i]+=1
        return d

    def ent(self,Y):
        freq = self.__count_unique(Y)
        ent_ = 0
        total = len(Y)
        for i in freq:
            p = freq[i]/total
            entropy_ += (-p)*math.log2(p)
        return ent_
Run Code Online (Sandbox Code Playgroud)

如果将其放置在 Jupyter Notebook 的单个单元格中,则上面的代码将会运行。但是,如果我希望将类代码拆分为多个单元格,如下所示,如何才能使类代码工作:

细胞1

class DTC:
    def __init__(self):
        self.__root = None
Run Code Online (Sandbox Code Playgroud)

细胞2

    def unique(self,Y):
        d = {}
        for i in Y:
            if i not in d:
                d[i]=1
            else:
                d[i]+=1
        return d
Run Code Online (Sandbox Code Playgroud)

细胞 3

    def ent(self,Y):
        freq = self.__unique(Y)
        ent_ = 0
        total = len(Y)
        for i in freq:
            p = freq[i]/total
            ent_ += (-p)*math.log2(p)
        return ent_
Run Code Online (Sandbox Code Playgroud)

anu*_*rag 3

在 Jupyter Notebooks 中,有两种方法可以将类定义拆分为多个单元格

方法一

以天真的方式做到这一点(利用继承和覆盖):

细胞1

class DTC:
    def __init__(self):
        self.__root = None
Run Code Online (Sandbox Code Playgroud)

细胞2

class DTC(DTC):
    def unique(self,Y):
        d = {}
        for i in Y:
            if i not in d:
                d[i]=1
            else:
                d[i]+=1
        return d
Run Code Online (Sandbox Code Playgroud)

细胞3

class DTC(DTC):
    def ent(self,Y):
        freq = self.__count_unique(Y)
        ent_ = 0
        total = len(Y)
        for i in freq:
            p = freq[i]/total
            entropy_ += (-p)*math.log2(p)
        return ent_
Run Code Online (Sandbox Code Playgroud)

需要注意的是,这实际上在内部创建了类的层次结构:

import inspect
inspect.getmro(DTC)
# outputs: (__main__.DTC, __main__.DTC, __main__.DTC, object)
Run Code Online (Sandbox Code Playgroud)

如果您不打算拉伸太多单元格,则可以使用此方法。

方法二

使用jdc包;jdc的更多详细信息/文档

细胞1

import jdc        # jupyter dynamic classes

class DTC:
    def __init__(self):
        self.__root = None
Run Code Online (Sandbox Code Playgroud)

细胞2

%%add_to DTC
def unique(self,Y):
    d = {}
    for i in Y:
        if i not in d:
            d[i]=1
        else:
            d[i]+=1
    return d
Run Code Online (Sandbox Code Playgroud)

细胞 3

%%add_to DTC
def ent(self,Y):
    freq = self.__count_unique(Y)
    ent_ = 0
    total = len(Y)
    for i in freq:
        p = freq[i]/total
        entropy_ += (-p)*math.log2(p)
    return ent_
Run Code Online (Sandbox Code Playgroud)

这次没有形成层次结构:

import inspect
inspect.getmro(DTC)
#output: (__main__.DTC, object)
Run Code Online (Sandbox Code Playgroud)