为什么我无法在同一模块中实例化实例?

Goi*_*Way 2 python

假设我的模块是myclass.py,这里是代码:

#!/usr/bin/env python
# coding=utf-8

class A(object):
    b = B()
    def __init__(self):
        pass

class B(object):
    pass
Run Code Online (Sandbox Code Playgroud)

并导入它

In [1]: import myclass
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-1-e891426834ac> in <module>()
----> 1 import myclass

/home/python/myclass.py in <module>()
      2 # coding=utf-8
      3 
----> 4 class A(object):
      5     b = B()
      6     def __init__(self):

/home/python/myclass.py in A()
      3 
      4 class A(object):
----> 5     b = B()
      6     def __init__(self):
      7         pass

NameError: name 'B' is not defined
Run Code Online (Sandbox Code Playgroud)

我知道如果我在类A上面定义类B,那就没问题,没有错误.但是,我不想这样做,有没有其他方法可以解决这个问题.我知道在C中有功能声明.谢谢!

nap*_*zba 8

类定义是一个声明.当语句AA执行时,的声明BB尚未执行.因此,没有课程B,你得到NameError: name 'B' is not defined

class A(object):
    b = B()              # <== AA
    def __init__(self):
        pass
class B(object):         # <== BB
    pass
Run Code Online (Sandbox Code Playgroud)

要解决这个问题:


您可以更改类的顺序:

class B(object):
    pass

class A(object):
    b = B()
    def __init__(self):
        pass
Run Code Online (Sandbox Code Playgroud)

您可以将其使用类的语句Bclassmethod和类的定义之后调用它B:

class A(object):

    @classmethod
    def init(cls):
        cls.b = B()

    def __init__(self):
        pass

class B(object):
    pass

A.init()
Run Code Online (Sandbox Code Playgroud)