python中的类声明出现问题.两个相互具有字段的类



我的代码是这样的:

class className1:
fieldClassName2 = className2()
class className2:
fieldClassName1 = className1()

并且我有NameError:名称"className2"未定义。我不知道python中是否有像c++中那样的声明,并且可以按任何顺序调用类。请帮帮我…

完整代码:

class Speciality(models.Model):
title = models.CharField(max_length=70)
subject1 = models.ManyToManyField(Subject, verbose_name='Перший предмет', related_name='+')
subject2 = models.ManyToManyField(Subject, verbose_name='Другий предмет', related_name='+')
subject3 = models.ManyToManyField(Subject, verbose_name='Третій предмет', related_name='+')
coefficient1 = models.FloatField()
coefficient2 = models.FloatField()
coefficient3 = models.FloatField()
coefficient4 = models.FloatField()
amount = models.IntegerField()
budget_amount = models.IntegerField()
department = models.ForeignKey(Department, verbose_name='Факультет', on_delete=models.CASCADE)
code = models.IntegerField(default=0)
abit = models.ManyToManyField(AdmissionList, verbose_name='Заявки', on_delete=models.CASCADE)
def __str__(self):
return str(self.code)
# there some another models
class AdmissionList(models.Model):
user = models.ForeignKey(User, verbose_name='Абітурієнт', on_delete=models.CASCADE)
speciality = models.ForeignKey(Speciality, verbose_name='Спеціальність', on_delete=models.CASCADE)
subject = models.ForeignKey(Subject, on_delete=models.CASCADE, null=True)
firstRate = models.IntegerField(default=0)
secondRate = models.IntegerField(default=0)
thirdRate = models.IntegerField(default=0)
avgRate = models.FloatField(default=0)
summaryRate = models.FloatField(default=0)
is_approved = models.BooleanField(default=False)
def __str__(self):
return self.user.full_name

字段Speciality.abit调用AdmissionList,字段AdmissionList.Speciality调用Speciality。

您可以尝试以下操作:

class className2:
def __init__(self, fieldClassName1=False):
self.fieldClassName1 = fieldClassName1
class className1:
fieldClassName2 = className2()

var1 = className1()
var2 = className2(var1)

print(type(var2.fieldClassName1))

它扭曲了代码的当前结构,但避免了循环依赖

Python是一种解释语言,而C++是一种编译语言。因此,在Python中,与C++相反,解释器逐行读取代码。这就是为什么当它到达第一个类定义时,它不知道className2。

你想要做的事情被称为循环依赖。在这个问题中描述了一个类似的问题:python类之间的循环依赖关系

如果我们根据您的问题调整解决方案,结果将是:

class className1:
pass
class className2:
pass
className1.fieldClassName2 = className2()
className2.fieldClassName1 = className1()

我想我通过在类调用中添加引号来避免这个问题

abit = models.ManyToManyField(AdmissionList, verbose_name='Заявки', on_delete=models.CASCADE)
abit = models.ManyToManyField('AdmissionList', verbose_name='Заявки', on_delete=models.CASCADE)

最新更新