如何在类定义中创建一个指向自身类型的属性?

2018-08-16 21:00:00 +08:00
 junezk
例如:
class People(object):
name = ""
friend = People()

由于 friend 还在类 People 的定义中,这里是不能引用 People 类的,请问这种情况代码该如何写?

相似的还有:
class A:
b = B()

class B:
a = A()

B 类可以引用 A 类,A 里面是不能引用 B 的,这种情况代码如何写?
1745 次点击
所在节点    Python
11 条回复
j0hnj
2018-08-16 21:05:38 +08:00
标准库里一般有两种做法,一种是像 enum 这样的用 metaclass 黑魔法,另一种就是先创建类,然后再添加属性,比如
class A: pass
class B: pass
A.b = B()
B.a = A()
drlalll
2018-08-16 21:05:55 +08:00
应该用 new 新建对象吧
junezk
2018-08-16 21:43:24 +08:00
@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 的语法了。
使用你给出的解决办法,结果不对,没有达到享耀的效果。
lynskylate
2018-08-16 21:46:50 +08:00
classmethod 会传入这个 class
junezk
2018-08-16 21:48:28 +08:00
@lynskylate 请问 classmethod 该如何使用?查了些资料,都没提到解决这种情况的。
vainl1
2018-08-16 22:09:10 +08:00
junezk
2018-08-16 22:35:13 +08:00
@vainl1 这和我问的问题有关系吗?
Yourshell
2018-08-16 22:45:34 +08:00
self.__class__
lynskylate
2018-08-16 22:46:15 +08:00
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
junezk
2018-08-16 22:52:22 +08:00
@Yourshell self 是在类的实例中使用的,引用类的实例,也就是对象本身。现在需要的是类定义时,引用其自身。或者两个类相互引用时,前一个类如何引用后一个类的类型。
junezk
2018-08-16 23:02:21 +08:00
@lynskylate 感谢,我需要的就是这个解决方案。baidu 搜了半天了也没找到相关的内容。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/480521

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX