我定义了两个模型,每个模型引用另一个模型,如下所示:
class User(models.Model):
# ...
loves = models.ManyToManyField(Article, related_name='loved_by')
class Article(models.Model):
# ...
author = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)
你看,问题是两个类都互相引用.无论这两个类的实现顺序如何,python总是引发NameError异常,抱怨任何一个类都没有定义.
我在models.py中有这样的东西
class ZipCode(models.Model):
zip = models.CharField(max_length=20)
cities = City.objects.filter(zip=self).distinct()
class City(models.Model):
name = models.CharField(max_length=50)
slug = models.CharField(max_length=50)
state = models.ForeignKey(State)
zip = models.ManyToManyField(ZipCode)
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我得到:
NameError: name 'City' is not defined
Run Code Online (Sandbox Code Playgroud)
这是因为申报的顺序很重要吗?如果是这样,我怎么能这样做,因为无论我采用哪种方式,看起来我都会得到一个NameError.
谢谢.
好的,因此使用Django REST框架教程中的直接示例,我有2个类:UserSerializer和SnippetSerializer。我希望能够在SnippetSerializer类声明中将“ UserSerializer”用作序列化程序,但是由于某些原因,需要首先声明SnippetSerializer。代码示例:
class SnippetSerializer(serializers.HyperlinkedModelSerializer):
owner = UserSerializer()
#unimportant stuff
class UserSerializer(serializers.HyperlinkedModelSerializer):
#unimportant stuff - lets say we reference SnippetSerializer here
Run Code Online (Sandbox Code Playgroud)
我想到的明显答案是前向声明,但是从我的所有研究中,我无法在Python中找到它。
我认为可能可行的另一种解决方案,但没有(也许我做错了吗?),而是尝试在init方法中声明此关系。
class SnippetSerializer(serializers.HyperlinkedModelSerializer):
def __init__(self, *args, **kwargs):
self.owner = UserSerializer()
super(SnippetSerializer, self).__init__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
但这似乎被框架完全忽略了。
我也尝试使用@addto,但似乎仅适用于函数,不适用于属性/属性
有办法解决这个问题吗?这个“先有鸡”类问题已经在Python中杀死了我一段时间,但是我终于遇到了一个实例,该实例实际上阻止了我完成工作。
如何在类似于C++的通用python程序中对方法进行原型设计?
//PROTOTYPE
do python protoyping
writeHello() //GIVES ERROR AS IT WAS NOT DEFINED YET
def writeHello():
print "Hello"
Run Code Online (Sandbox Code Playgroud) 我第一次看到了Python,我被困在这里:
class A:
def __init__(self):
a = foo("baa")
class B(A):
b = foo("boo")
def foo(string):
return string
Run Code Online (Sandbox Code Playgroud)
此时我加载上面的文件(命名classes),这发生了:
$ python
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from classes import *
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "classes.py", line 5, in <module>
class B(A):
File "classes.py", line 6, in B
b = foo("boo")
NameError: …Run Code Online (Sandbox Code Playgroud) # animal.py
class Animal:
def __init__(self):
self.action = {'feed':feed_pet}
def do_action(self, a):
action[a]()
def feed_pet(self):
print('Gives some food')
# main.py
from animal import *
my_pet = Animal()
my_pet.do_action('feed')
Run Code Online (Sandbox Code Playgroud)
我正在制作游戏,但这段代码给了我以下错误:
Traceback (most recent call last):
File "so.py", line 3, in <module>
my_pet = Animal()
File "/home/wdwickar/pyside/animal.py", line 4, in __init__
self.action = {'feed':feed_pet}
NameError: name 'feed_pet' is not defined
Run Code Online (Sandbox Code Playgroud)
像C这样的Python中没有前向声明吗?