Python中的嵌套类

Python中的嵌套类,python,class,nested-class,Python,Class,Nested Class,在Python中处理类(嵌套等)看起来并不容易,令人惊讶地!以下问题最近出现在我面前,花了几个小时(尝试、搜索…)都没有成功。我读了大部分相关的链接,但没有一个指向这里提出的问题 #------------------------------------ class A: def __init__(self): self.a = 'a' print self.a class B(A): def __init__(self): se

Python中处理类(嵌套等)看起来并不容易,令人惊讶地!以下问题最近出现在我面前,花了几个小时(尝试、搜索…)都没有成功。我读了大部分相关的链接,但没有一个指向这里提出的问题

#------------------------------------ class A: def __init__(self): self.a = 'a' print self.a class B(A): def __init__(self): self.b = 'b' A.a = 'a_b' print self.b, A.a #------------------------------------ class C: class A: def __init__(self): self.a = 'a' print self.a class B(A): def __init__(self): self.b = 'b' A.a = 'a_b' print self.b, A.a #------------------------------------ #------------------------------------ >>> c1 = A() a >>> c1.a 'a' >>> c2 = B() b >>> c2.a, c2.b ('a_b', 'b') >>> c3 = C() >>> c4 = c3.A() a >>> c4.a 'a' >>> c5 = c3.B() b a_b >>> c5.b 'b' >>> c5.a Traceback (most recent call last): File "", line 1, in AttributeError: B instance has no attribute 'a' 其结果是:

Curvature 0.5 Curvature 0 曲率0.5 曲率0
我正在寻找的。

嵌套类看起来很不和谐,即使被认为是工厂。但要回答你的问题:根本没有c5.a(C.B的实例)。在C.B的init方法中,您向类C.A添加了一个属性A,但没有添加到C.B!类A已经有了一个属性A,如果实例化的话!但是类B(甚至类)的对象没有

你也必须记住, java iNITSy<<代码>不是C++或Java中的构造函数!python中的“真正的构造函数”应该是

\uuuuu new\uuuu
<代码>\uuuu init\uuuu只是初始化一个类的实例

class A:
    c = 'class-attribute'
    def __init__(self):
        self.i = 'instance-attribute'
所以在这个例子中c是一个类属性,其中i是实例的属性

更有趣的是,您试图在子类实例化时向基类添加属性。这样就不会得到“延迟”继承属性。 您只需向类A添加一个额外的属性,这甚至让我感到惊讶。我猜您正在使用Python3.x

这种行为的原因是什么?好吧,我想这与python定义中的整洁特性(AFAIK)有关

原因相同:

def method(lst = []):

这几乎是个坏主意。deafult参数在定义时被绑定,您不会在每次调用该方法时生成新的列表对象,而是重用同一个列表对象。

在方法中执行的代码在该方法的本地范围内运行。如果访问不在此范围内的对象,Python将在全局/模块范围内、类范围内或任何封闭类的范围内查找它

这意味着:

A.a = 'a_b'
C.B.内部.\uuuu init\uuuu
将设置全局
A
类的class属性,而不是
C.A
您可能想要的属性。为此,您必须这样做:

C.A.a = 'a_b'
此外,如果在子类中重写父方法,Python将不会调用它们。你必须自己做

作用域规则意味着,如果要在
C.B.\uuuuinit\uuuu
中调用父类的
\uuuuuu init\uuu
方法,它必须如下所示:

C.A.__init__(self)
A.__init__(self)
不是这样的:

C.A.__init__(self)
A.__init__(self)

这可能是您尝试过的。

“…
A.\uuuu init\uuuu()
在B()的
\uuuu init\uuuu()
中被调用不起作用!”图片或它没有发生。同上。你在
B.\uuuuu init\uuuu()
中对
A.\uuuuu init\uuuuu()
的调用是什么样子的?@IgnacioVazquez Abrams现在找到了问题的解决方案。几小时后就好了。您可以在问题的更新部分找到您的观点。@soulcheck有关Ignacio Vazquez Abrams的信息,请参阅我在上面的评论。@Supporter如果您只创建了一个名为“Geometry”的模块,而不是外部几何体类,那会简单得多。然后得到完全相同的分组,但没有嵌套类的复杂性:
将几何体导入为g
c=g.Curve(0.5)
l=g.Line()
谢谢。我可以用你的关键点
范围规则解决这个问题。完整解决方案已作为更新添加。感谢您的回答。正如您在问题的更新部分中所看到的,有时嵌套类会使编程更加结构化和易于处理。