Python:如何为当前类指定Class函数的参数类型?

问题描述 投票:0回答:1

我正在使用 Python 编写一组具有继承性的自定义类。这是简化的代码:

class Parent(object):
    __slots__ = ['a','b']

    def __init__(self, a:int, b:int):
        self.a = a
        self.b = b
    
    def myfunc(self,s)->int:
        return self.a + s.a

class Child(Parent):
    __slots__ = ['c']

    def __init__(self, a:int, b:int, c:int):
        super().__init__(a,b)
        self.c = c

    def myfunc(self,s)->int:
        return self.a + s.a + s.c

def main():
    dad = Parent(1,2)
    son = Child(4,8,16)

    print(dad.myfunc(son))
    print(son.myfunc(son))
    print(son.myfunc(dad))

if __name__ == "__main__":
    main()

运行该函数后,我得到以下输出(我理解):

5
24
Error: Parent has no attribute 'c'

Child 中的 myfunc() 定义要求 self AND 都是 Child 的实例。

我对这段代码的理想功能是我想实现方法重载。当

son.myfunc(dad)
被调用时,我希望它检查爸爸的类型。如果爸爸也是
Child
,则应该使用
Child
myfunc()
的定义。否则,如果爸爸不是
Child
,儿子应该重新使用
myfunc()
Parent
的定义。所以,对于上面的代码,我想要:

5
24
5

我本以为我可以按如下方式实现这个功能,指定

myfunc()
的参数类型:

class Parent(object):
    __slots__ = ['a','b']

    def __init__(self, a:int, b:int):
        self.a = a
        self.b = b
    
    def myfunc(self, s:Parent)->int:
        return self.a + s.a

class Child(Parent):
    __slots__ = ['c']

    def __init__(self, a:int, b:int, c:int):
        super().__init__(a,b)
        self.c = c

    def myfunc(self,s:Child)->int:
        return self.a + s.a + s.c

def main():
    dad = Parent(1,2)
    son = Child(4,8,16)

    print(dad.myfunc(son))
    print(son.myfunc(son))
    print(son.myfunc(dad))

if __name__ == "__main__":
    main()

但是,这行不通。当我用Python和我的IDE来指定

"Parent is not defined"
的输入类型时,
Parent's myfunc()
告诉我,
Child
也是如此。我想我明白它的意思(在编译器完成读取 Parent 之前,“
Parent
”没有任何意义,因此不能将其指定为参数类型),但我不知道如何解决这个问题。

如何实现我想要的功能?是否有像

'this'
'self'
这样的关键字可用于引用这些规范的当前类的类型?即使方法重载不能以这种方式工作 - 有没有办法让单个类 (
Parent
) 将自身指定为其函数之一的参数类型?

编辑:我知道Python参数类型是用于可读性和错误检查的注释,如果使用不同的类型调用它们实际上不会导致错误/失败。创建第二个代码段是为了帮助传达我“想要”发生的事情。我知道我可能需要在 myfunc 的开头添加一个像 isinstance() 这样的检查,但是 (a) 如果有替代方案,我想避免它 (b) 如果我确实在 Child 的 myfunc() 主体中发现我想调用 Parent 的,我不确定我会如何做到这一点。

python class inheritance types overloading
1个回答
6
投票

    为了键入提示返回其自己的类的方法(
  1. 前向引用

    ),您应该使用字符串: class Parent(object): def myfunc(self, s: "Parent") -> int:

    更新:从
    Python 3.11

    开始,您还可以使用Self注释

    from typing import Self class Parent(object): def myfunc(self, s: Self) -> int:

  2. 您可以使用
  3. isinstance

    检查类型,即

    def myfunc(self, s: "Child") -> int:
        return (self.a + s.a + s.c) if isinstance(s, Child) else (self.a + s.a)
    

    
    
  4. 顺便说明一下,您的
s

中的

Child.myfunc
类型可能应该是
Parent
更新:根据您的评论,以下内容应该是可能的:

class Parent(object): # ... def _myfunc(self, s: "Parent") -> int: return self.a + s.a def myfunc(self, s: "Parent") -> int: return type(s)._myfunc(self, s) class Child(Parent): # ... def _myfunc(self, s: "Parent") -> int: return self.a + s.a + s.c

	
© www.soinside.com 2019 - 2024. All rights reserved.