推荐学习书目
› 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 · Apr 20, 2020 · 5380 views
    This topic created in 2389 days ago, the information mentioned may be changed or developed.
    class Parent:
    	def getSelf(self) -> "Parent":
        	return self
    
    
    class Child(Parent):
    	# 这儿继承 Parent 类, self.getSelf 应当返回"Child", 但是类型提示中仍然是"Parent"
        # 难道每一个继承 Parent 类的, 都要重新声明 getSelf 函数吗?
    	# ...
    	def getSelf(self) -> "Child":
        	return self
    
    
    Supplement 1  ·  Apr 21, 2020
    因为回复这个问题半个晚上被 ban+解封两三次了,不多写了。。。

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

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

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

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

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