Python Jupyter-在多个单元格中拆分类

Python Jupyter-在多个单元格中拆分类,python,jupyter-notebook,Python,Jupyter Notebook,我想知道是否有可能将jupyter类拆分为不同的单元?让我们说: 对于更复杂的类来说,将它们写入一个单元格是非常烦人的。 我想把每个方法放在不同的单元格中 去年有人做了这个,但我想知道是否有内置的东西,所以我不需要外部脚本/导入 如果没有,我想知道是否有理由不让您有机会拆分代码并以更简单的方式记录/调试它 提前谢谢我不觉得这整件事是个问题或好主意。。。但也许以下几点对你有用: 我不期望它非常健壮,但是。。。它应该适用于普通班 编辑:我相信在一些情况下,这可能会中断。我不确定这是否会

我想知道是否有可能将jupyter类拆分为不同的单元?让我们说:




对于更复杂的类来说,将它们写入一个单元格是非常烦人的。 我想把每个方法放在不同的单元格中

去年有人做了这个,但我想知道是否有内置的东西,所以我不需要外部脚本/导入

如果没有,我想知道是否有理由不让您有机会拆分代码并以更简单的方式记录/调试它


提前谢谢

我不觉得这整件事是个问题或好主意。。。但也许以下几点对你有用:





我不期望它非常健壮,但是。。。它应该适用于普通班

编辑:我相信在一些情况下,这可能会中断。我不确定这是否会抵制代码检查,因为该方法离类“很远”。但是您使用的是笔记本,所以代码检查不应该是一个问题(?),尽管在调试时请记住这一点

另一个可能的问题可能与元类的使用有关。如果您试图使用元类(或从使用元类的某个类派生),这可能会破坏元类,因为元类通常希望能够知道该类的所有方法,并且通过向类动态添加方法,我们正在扭曲类创建流的规则

如果没有元类或一些“非常奇怪”的用例,这种方法应该是安全的


对于“简单”类,这是一种非常有效的方法。但是这并不是一个预期的特性,因此(ab)使用它可能会带来一些额外的问题,我可能不会

无法拆分单个类, 但是,您可以将方法动态添加到它的实例中

单元格#1

import types
class A:
    def __init__(self, var):
        self.var = var

a = A()
在另一个单元中:

单元格#2

def print_var(self):
    print (self.var)
a.print_var = types.MethodType( print_var, a )
现在,这应该是可行的:

单元格#3

a.print_var()

Github问题“跨多个单元格定义Python类#1243”提供了两种解决方案,可在此处找到:

一个解决方案是使用一个神奇的函数,该函数来自一个为这个特定案例开发的名为jdc或Jupyter dynamic Class的包。有关如何安装和如何使用的文档可以在以下地址的程序包url上找到:

第二个解决方案是由提供的,它只在常规Python中工作,不需要使用任何额外的魔法,如下所示:

单元1:

class MyClass():
    def method1(self):
        print("method1")
单元2:

class MyClass(MyClass):
    def method2(self):
        print("method2")
单元3:

instance = MyClass()
instance.method1()
instance.method2()

我自己在Jupyter笔记本和VS代码中测试了第二个解决方案,它在这两种环境中都运行良好,只是我在VS代码中得到了一个pylint错误[pylint]E0102:class已经定义了第5行,这是一种预期,但仍然运行良好。此外,VS代码本来就不应该成为目标环境。

来自您给出的同一链接:谢谢您的回答。对我来说,这似乎有效。你能解释一下为什么它不是很结实吗?谢谢你,我想就我而言,它会很好的。另一方面,很容易将细胞组合起来,并仅在发育过程中为了清晰起见而使用。
def print_var(self):
    print (self.var)
a.print_var = types.MethodType( print_var, a )
a.print_var()
class MyClass():
    def method1(self):
        print("method1")
class MyClass(MyClass):
    def method2(self):
        print("method2")
instance = MyClass()
instance.method1()
instance.method2()