又花了三个小时后,我想我可能会得到解决方案。前向引用
如果没有更好的方法可以做到这一点,我稍后会关闭这个问题并发布该解决方案
我正在对一个程序进行逆向工程(并尝试使用 Python 来实现它)。
我遇到了这个问题
比如我在ComponentOfCar.py中有一个类,代码如下
__all__ = ("ComponentOfCar");
import Car;
#...#imports other needed packages
class ComponentOfCar(object):
def __init__(self, owner:Car.Car):
self.owner = owner;
self.type = "Default";
#....#create other attribute
像这样的另一个类(Car.py):
__all__ = ("Car");
import ComponentOfCar;
#...#imports other needed packages
class Car(object):
__slots__ = ("m_lstComponents",....);
def __init__(self, data:FlatBuffersBinaryData):
self.m_lstComponents = list();
self.LoadFromData(data);
#....#create other attribute
def InstallComponen(self, component:ComponentOfCar.ComponentOfCar)->bool:
self.m_lstComponents.append(component);
return True;
但是这样做之后我遇到了这个问题:
Traceback (most recent call last):
File "Y:\Car.py", line 2, in <module>
import ComponentOfCar;
File "Y:\ComponentOfCar.py", line 2, in <module>
import Car;
File "Y:\Car.py", line 4, in <module>
class Car(object):
File "Y:\Car.py", line 10, in Car
def InstallComponen(self, component:ComponentOfCar.ComponentOfCar)->bool:
AttributeError: module 'ComponentOfCar' has no attribute 'ComponentOfCar'
原始程序是用编译语言编写的。里面的类继承很复杂,有上百个类,让我很头疼。
我想通过使用类型注释并将每个类分成单独的文件来使这个过程更加清晰。但这必须使用递归导入。
google了半天也没找到解决办法,就来这里求助。Python不能像编译语言那样做到这一点,还是我犯了一些错误?我很困惑。我该如何解决。
对不起我的英语不好。感谢您的宝贵时间。:)
要详细
下面是反编译的类声明的结构如下(是c#,整个文件大约有十万行):
// Namespace: GameNamespace
public class Car
{
// Fields
protected List`1<ComponentOfCar> m_lstComponents;
public int ObjectID;
// Methods
public void .ctor(Data data);
public void AddComponent(ComponentOfCar c);
}
// Namespace: GameNamespace
public abstract class ComponentOfCar
{
// Fields
protected Car m_owner;
// Properties
public Car Owner { get; }
// Methods
public Car get_Owner();
public void .ctor(Car owner);
}
或者我的问题是如何使用 python 来清楚地实现这一点。
是的,在我的想法中,上面显示的方法是,我知道这是错误的,但我不知道如何使它正确。我不应该把它们分开吗?或者我可以让它们以另一种方式编写(以避免递归导入和)做与 c# 中相同的事情?
请告诉我解决这个问题的方法,非常感谢。
又花了三个小时后,我想我可能会得到解决方案
forward-references,我正在检查这个。如果没有更好的方法可以做到这一点,我稍后会关闭这个问题并发布该解决方案,它可能会修复我的代码。