gpt4 book ai didi

python - Python 中的嵌套类

转载 作者:太空狗 更新时间:2023-10-29 22:27:39 27 4
gpt4 key购买 nike

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

#------------------------------------class A:    def __init__(self):        self.a = 'a'        print self.aclass 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.aTraceback (most recent call last):  File "", line 1, in AttributeError: B instance has no attribute 'a'

代码哪里出了问题?在这两种情况下,似乎在初始化 B(A) 时 A() 未初始化。这个问题的解决方案是什么?请注意,在 B() 的 __init__() 中调用的术语 A.__init__() 不起作用!

更新:

class Geometry:    class Curve:        def __init__(self,c=1):            self.c = c                          #curvature parameter            print 'Curvature %g'%self.c            pass                                #some codes    class Line(Curve):        def __init__(self):            Geometry.Curve.__init__(self,0)     #the key point            pass                                #some codesg = Geometry()C = g.Curve(0.5)L = g.Line()

结果是:

Curvature 0.5Curvature 0

我在寻找什么。

最佳答案

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

这意味着:

A.a = 'a_b'

C.B.__init__ 中将设置全局 A 类的类属性,而不是您可能想要的 C.A 。为此,您必须这样做:

C.A.a = 'a_b'

此外,如果您在子类中重写父方法,Python 将不会调用它们。你必须自己做。

作用域规则意味着如果你想在 C.B.__init__ 中调用父类的 __init__ 方法,它必须如下所示:

C.A.__init__(self)

而且不是这样的:

A.__init__(self)

这可能是您尝试过的。

关于python - Python 中的嵌套类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8775246/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com