Python 返回 self 时类型应该怎么写?

2020-04-20 17:51:44 +08:00
 xiaoming1992
class Parent:
	def getSelf(self) -> "Parent":
    	return self


class Child(Parent):
	# 这儿继承 Parent 类, self.getSelf 应当返回"Child", 但是类型提示中仍然是"Parent"
    # 难道每一个继承 Parent 类的, 都要重新声明 getSelf 函数吗?
	# ...
	def getSelf(self) -> "Child":
    	return self

3667 次点击
所在节点    Python
27 条回复
zhoudaiyu
2020-04-20 18:10:17 +08:00
zachlhb
2020-04-20 18:11:02 +08:00
写 self 呢,其实可以不用写返回类型
Acebiu
2020-04-20 18:24:56 +08:00
T = TypeVar('T', bound='Parent')

class Parent:
def get_self(self) -> T:
return self

class Child(Parent):
pass
wellsc
2020-04-20 18:25:52 +08:00
不用返回
Hstar
2020-04-20 18:30:03 +08:00
这代码怎么看起来一股 Java 味
InkStone
2020-04-20 18:31:25 +08:00
如果你不重新声明的话,返回类型确实是 Parent 而不是 Child 啊。
Trim21
2020-04-20 18:33:38 +08:00
感觉 3 楼回复还要稍微改一下

def get_self(self: T) -> T:
Trim21
2020-04-20 18:39:45 +08:00
lithbitren
2020-04-20 20:38:38 +08:00
一股 java 味,真实
Liyiw
2020-04-20 20:54:13 +08:00
学到了
SpencerCJH
2020-04-20 20:54:33 +08:00
这怎么一股 Java 味。。。
zhustec
2020-04-20 21:05:53 +08:00
我之前也碰到类似的问题就是使用 dataclass 和 typing 时如何只是当前类,比如写链表时节点类表示指向下一个节点。
lxy42
2020-04-20 21:40:56 +08:00
网上查了一下, 这个 issue 使用了前面两位提到的 TypeVar 方法: https://github.com/python/typing/issues/271
zhoudaiyu
2020-04-20 22:01:52 +08:00
@Hstar
@lithbitren
@SpencerCJH
Java 味?啥意思 没写过 Java 逃)
ClericPy
2020-04-20 22:07:38 +08:00
@zhoudaiyu #14 泛型
raymanr
2020-04-20 22:10:19 +08:00
呃,没看懂,干嘛返回自身这个实例?
Acebiu
2020-04-20 22:12:53 +08:00
@Trim21 #7 是我漏了,感谢提醒。

@raymanr #16 比如采用建造者模式的时候就要返回自身实例。
chenxytw
2020-04-21 00:02:07 +08:00
@zhustec 这个倒有多种方案 0 0
1. 等 Python4
2. from future import annotations
3. 用字符串
xiaoming1992
2020-04-21 00:35:15 +08:00
@InkStone 不,返回的是子类,但智能提示为父类
@zachlhb @zhoudaiyu 代码运行都是正确的,只是智能提示不正确
xiaoming1992
2020-04-21 00:36:47 +08:00
@chenxytw 字符串确实能解决,但是我不可能每一个继承的自带都重写一下,如果我有十几个类要继承,总不能都重写一下吧(虽然我目前就是这么做的。。。)

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

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

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

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

© 2021 V2EX