xiaoming1992
V2EX  ›  Python

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

By xiaoming1992 at 2020 年 4 月 20 日 · 5241 次点击
class Parent:
	def getSelf(self) -> "Parent":
    	return self


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

第 1 条附言  ·  2020 年 4 月 21 日
因为回复这个问题半个晚上被 ban+解封两三次了,不多写了。。。

1. 楼下问为什么返回 self,因为要链式调用啊
2. 一股 Java 味?我只玩 ts,没用过 Java 啊
3. 返回的是子类的实例,但智能提示为父类,我需要的是让智能提示能正确
27 条回复  •  2020-04-21 21:54:57 +08:00
zhoudaiyu
   1
zhoudaiyu  
   2020 年 4 月 20 日
?
zachlhb
   2
zachlhb  
   2020 年 4 月 20 日 via Android
写 self 呢,其实可以不用写返回类型
Acebiu
   3
Acebiu  
   2020 年 4 月 20 日   ❤️ 1
T = TypeVar('T', bound='Parent')

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

class Child(Parent):
pass
wellsc
   4
wellsc  
   2020 年 4 月 20 日 via Android
不用返回
Hstar
   5
Hstar  
   2020 年 4 月 20 日
这代码怎么看起来一股 Java 味
InkStone
   6
InkStone  
   2020 年 4 月 20 日
如果你不重新声明的话,返回类型确实是 Parent 而不是 Child 啊。
Trim21
   7
Trim21  
   2020 年 4 月 20 日 via Android   ❤️ 1
感觉 3 楼回复还要稍微改一下

def get_self(self: T) -> T:
lithbitren
   9
lithbitren  
   2020 年 4 月 20 日
一股 java 味,真实
Liyiw
   10
Liyiw  
   2020 年 4 月 20 日
学到了
0dJ6Tu8Za734L89T
   11
0dJ6Tu8Za734L89T  
   2020 年 4 月 20 日
这怎么一股 Java 味。。。
zhustec
   12
zhustec  
   2020 年 4 月 20 日 via Android
我之前也碰到类似的问题就是使用 dataclass 和 typing 时如何只是当前类,比如写链表时节点类表示指向下一个节点。
lxy42
   13
lxy42  
   2020 年 4 月 20 日
网上查了一下, 这个 issue 使用了前面两位提到的 TypeVar 方法: https://github.com/python/typing/issues/271
zhoudaiyu
   14
zhoudaiyu  
   2020 年 4 月 20 日
@Hstar
@lithbitren
@SpencerCJH
Java 味?啥意思 没写过 Java 逃)
ClericPy
   15
ClericPy  
   2020 年 4 月 20 日
@zhoudaiyu #14 泛型
raymanr
   16
raymanr  
   2020 年 4 月 20 日
呃,没看懂,干嘛返回自身这个实例?
Acebiu
   17
Acebiu  
   2020 年 4 月 20 日
@Trim21 #7 是我漏了,感谢提醒。

@raymanr #16 比如采用建造者模式的时候就要返回自身实例。
chenxytw
   18
chenxytw  
   2020 年 4 月 21 日
@zhustec 这个倒有多种方案 0 0
1. 等 Python4
2. from future import annotations
3. 用字符串
xiaoming1992
   19
xiaoming1992  
OP
   2020 年 4 月 21 日
@InkStone 不,返回的是子类,但智能提示为父类
@zachlhb @zhoudaiyu 代码运行都是正确的,只是智能提示不正确
xiaoming1992
   20
xiaoming1992  
OP
   2020 年 4 月 21 日
@chenxytw 字符串确实能解决,但是我不可能每一个继承的自带都重写一下,如果我有十几个类要继承,总不能都重写一下吧(虽然我目前就是这么做的。。。)
calease
   21
calease  
   2020 年 4 月 21 日
@Acebiu
java 是因为不支持 keyword argument 才有建造者模式。
python 有 keyword argument,弄建造者模式是 over engineering 。
lizytalk
   22
lizytalk  
   2020 年 4 月 21 日 via iPhone
用引号包起来就行了
InkStone
   23
InkStone  
   2020 年 4 月 21 日
@xiaoming1992 type hint 其实就是把函数当静态类型来推理,一个函数只能有一种返回值,那自然就是父类类型。至于实际返回的对象是什么类型,这是另外一回事。这个 type hint 确实没错,只是它跟你的理解不太一样。
xiaoming1992
   24
xiaoming1992  
OP
   2020 年 4 月 21 日
@InkStone 我只是看到,同样的代码,ts 里面的类型推断是正确的,但是 py 不正确,所以希望看看有没有什么方法能实现
bnm965321
   25
bnm965321  
   2020 年 4 月 21 日
是 Pycharm IDE 提示不正确,还是 mypy typecheck 不正确?
chenxytw
   26
chenxytw  
   2020 年 4 月 21 日
@xiaoming1992 没针对你的问题啦....你这个问题我也不知道....也是进来学习的 Orz....
xiaoming1992
   27
xiaoming1992  
OP
   2020 年 4 月 21 日 via Android
@bnm965321 vscode python 插件的智能提示
推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
© 2026 V2EX · 61ms · 3.9.8.5