我正在使用 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 的,我不确定我会如何做到这一点。
),您应该使用字符串:
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:
isinstance
检查类型,即
def myfunc(self, s: "Child") -> int:
return (self.a + s.a + s.c) if isinstance(s, Child) else (self.a + s.a)
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