Python有类原型(或前向声明)吗?

Mat*_*Mat 36 python oop prototype class

我在一个文件中有一系列Python类.有些类引用其他类.

我的代码是这样的:

class A():
    pass

class B():
    c = C()

class C():
    pass
Run Code Online (Sandbox Code Playgroud)

试着去试试那个,我明白了NameError: name 'C' is not defined.很公平,但有没有办法使它工作,或者我是否必须手动重新订购我的课程以适应?在C++中,我可以创建一个类原型.Python有相同的功能吗?

(我实际上正在使用Django模型,但我没有尝试使问题复杂化).

ver*_*guy 54

实际上,以上所有都是关于Python的很好的观察,但没有一个能解决你的问题.

Django需要反省内容.

做你想做的事的正确方法如下:

class Car(models.Model):
    manufacturer = models.ForeignKey('Manufacturer')
    # ...

class Manufacturer(models.Model):
    # ...
Run Code Online (Sandbox Code Playgroud)

请注意使用类名作为字符串而不是文字类引用.Django提供了这种替代方案来处理Python不提供前向声明的问题.

这个问题让我想起了一个经典的支持问题,你应该总是问任何一个问题的客户:"你真正想做什么?"


Joe*_*way 34

在Python中,您本身并不创建原型,但您需要了解"类属性"和实例级属性之间的区别.在上面显示的示例中,您在类B上声明了一个类属性,而不是实例级属性.

这就是你要找的东西:

class B():
    def __init__(self):
        self.c = C()
Run Code Online (Sandbox Code Playgroud)

  • 这里的好建议.我要添加的另一件事是_if_你在尝试定义一个ForeignKey时遇到了这个问题,你可以简单地将类名作为字符串传递,Django将解决它. (4认同)
  • 是的,因为 c=C() 在类定义中(在模块加载时执行),所以类 C 尚不存在。 (3认同)
  • @truppo是对的.声明类属性时,在加载模块时解析相应的引用(即解释类).__init__方法类似于其他语言中的构造函数,因此在调用之前不必解析其本地作用域中的引用 (3认同)
  • 我很好奇为什么 Python 在分配实例属性而不是类级别时可以找到 C 的 def'n 的解释。是因为它试图在类定义而不是运行时进行分配吗? (2认同)

tru*_*ppo 8

这将解决您提出的问题(但我认为您真的在寻找一个实例属性,因为jholloway7已回复):

class A:
    pass

class B:
    pass

class C:
    pass

B.c = C()
Run Code Online (Sandbox Code Playgroud)