当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Python有类原型(或前向声明)吗?》经验,为你挑选了3个好方法。

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

我的代码是这样的:

class A():
    pass

class B():
    c = C()

class C():
    pass

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

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



1> verveguy..:

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

Django需要反省内容.

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

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

class Manufacturer(models.Model):
    # ...

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

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



2> Joe Holloway..:

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

这就是你要找的东西:

class B():
    def __init__(self):
        self.c = C()


这里的好建议.我要添加的另一件事是_if_你在尝试定义一个ForeignKey时遇到了这个问题,你可以简单地将类名作为字符串传递,Django将解决它.
@truppo是对的.声明类属性时,在加载模块时解析相应的引用(即解释类).__init__方法类似于其他语言中的构造函数,因此在调用之前不必解析其本地作用域中的引用

3> truppo..:

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

class A:
    pass

class B:
    pass

class C:
    pass

B.c = C()

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有