1
j0hnj 2018-08-16 21:05:38 +08:00 via iPhone
标准库里一般有两种做法,一种是像 enum 这样的用 metaclass 黑魔法,另一种就是先创建类,然后再添加属性,比如
class A: pass class B: pass A.b = B() B.a = A() |
2
drlalll 2018-08-16 21:05:55 +08:00
应该用 new 新建对象吧
|
3
junezk OP @j0hnj 其实出现这个需求是我在使用 django RESTframework 做序列化时遇到的。
我在 django 中定义了一个类型的 model: class Channel(models.Model): """ 分类 """ name = models.CharField(verbose_name="分类名称", max_length=40) display_name = models.CharField(verbose_name="显示名称", max_length=40) parent = models.ForeignKey("Channel", null=True, blank=True, related_name="sub_channels", on_delete=models.SET_NULL) Channel 对象的 parent 属性可以指向自己类型的对象。 做序列化时,就要定义 class ChannelSerializer(serializers.ModelSerializer): parent = ChannelSerializer(read_only=True) class Meta: model = Channel fields = '__all__' 这样的代码,这就不符合 Python 的语法了。 使用你给出的解决办法,结果不对,没有达到享耀的效果。 |
4
lynskylate 2018-08-16 21:46:50 +08:00 via Android
classmethod 会传入这个 class
|
5
junezk OP @lynskylate 请问 classmethod 该如何使用?查了些资料,都没提到解决这种情况的。
|
6
vainl1 2018-08-16 22:09:10 +08:00 via iPhone
|
8
Yourshell 2018-08-16 22:45:34 +08:00 via iPhone
self.__class__
|
9
lynskylate 2018-08-16 22:46:15 +08:00 via Android
sorry 刚才没看仔细,其实一楼是符合你最初的描述的,不过不符合你的需求。
你的要求是自引用序列化,可以看下这个,对于实在需要自定义程度很大的字段其实可以覆写他的 create valid 方法。 http://www.google.com/url?q=https://stackoverflow.com/questions/13376894/django-rest-framework-nested-self-referential-objects&sa=U&ved=2ahUKEwihxJmZ5_HcAhXov1QKHT0ECmcQFjAAegQIBxAB&usg=AOvVaw06lQugVRb1STGxI0PRr3Lz |
10
junezk OP @Yourshell self 是在类的实例中使用的,引用类的实例,也就是对象本身。现在需要的是类定义时,引用其自身。或者两个类相互引用时,前一个类如何引用后一个类的类型。
|
11
junezk OP @lynskylate 感谢,我需要的就是这个解决方案。baidu 搜了半天了也没找到相关的内容。
|