V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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
xiaoming1992
V2EX  ›  Python

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

  •  
  •   xiaoming1992 · 2020-04-20 17:51:44 +08:00 · 3905 次点击
    这是一个创建于 1681 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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-04-21 00:28:42 +08:00
    因为回复这个问题半个晚上被 ban+解封两三次了,不多写了。。。

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

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

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

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

    @raymanr #16 比如采用建造者模式的时候就要返回自身实例。
    chenxytw
        18
    chenxytw  
       2020-04-21 00:02:07 +08:00
    @zhustec 这个倒有多种方案 0 0
    1. 等 Python4
    2. from future import annotations
    3. 用字符串
    xiaoming1992
        19
    xiaoming1992  
    OP
       2020-04-21 00:35:15 +08:00
    @InkStone 不,返回的是子类,但智能提示为父类
    @zachlhb @zhoudaiyu 代码运行都是正确的,只是智能提示不正确
    xiaoming1992
        20
    xiaoming1992  
    OP
       2020-04-21 00:36:47 +08:00
    @chenxytw 字符串确实能解决,但是我不可能每一个继承的自带都重写一下,如果我有十几个类要继承,总不能都重写一下吧(虽然我目前就是这么做的。。。)
    calease
        21
    calease  
       2020-04-21 06:56:15 +08:00
    @Acebiu
    java 是因为不支持 keyword argument 才有建造者模式。
    python 有 keyword argument,弄建造者模式是 over engineering 。
    lizytalk
        22
    lizytalk  
       2020-04-21 09:10:59 +08:00 via iPhone
    用引号包起来就行了
    InkStone
        23
    InkStone  
       2020-04-21 09:38:31 +08:00
    @xiaoming1992 type hint 其实就是把函数当静态类型来推理,一个函数只能有一种返回值,那自然就是父类类型。至于实际返回的对象是什么类型,这是另外一回事。这个 type hint 确实没错,只是它跟你的理解不太一样。
    xiaoming1992
        24
    xiaoming1992  
    OP
       2020-04-21 09:48:37 +08:00
    @InkStone 我只是看到,同样的代码,ts 里面的类型推断是正确的,但是 py 不正确,所以希望看看有没有什么方法能实现
    bnm965321
        25
    bnm965321  
       2020-04-21 09:52:36 +08:00
    是 Pycharm IDE 提示不正确,还是 mypy typecheck 不正确?
    chenxytw
        26
    chenxytw  
       2020-04-21 19:18:01 +08:00
    @xiaoming1992 没针对你的问题啦....你这个问题我也不知道....也是进来学习的 Orz....
    xiaoming1992
        27
    xiaoming1992  
    OP
       2020-04-21 21:54:57 +08:00 via Android
    @bnm965321 vscode python 插件的智能提示
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1151 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:57 · PVG 06:57 · LAX 14:57 · JFK 17:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.