1.Python的重载
与C语言不同,其实在Python中是没有函数重载的,也即函数不可同名。但当我们查看某些内置类的定义时(如何dict类),会发现有许多同名函数的存在,只不过上述加了@overload的装饰器
具体用法是:
from typing import overload
@overload
def repeat(a:int,b:int):
print(1)
@overload
def repeat(a:int,b:str):
print(2)
def repeat(a:float,b:float):
print(3)
repeat(3.3,5.0) #python的重载其实是一种假的重载
也即@overload只是起到一个类似于注释,给读者选择的作用,真正起作用的函数是上面没有被@overload装饰的,也即需要调用那种,就去除它上面的@overload
2.继承中super().的使用
在python,使用super().函数名(形参,不用加self),可以在类中调用父类的函数。在子类中执行父类函数时,里面的self全部自动转化为子类。
class Animal1():
def __init__(self,name,age):
self.name=name
self.age=age
def greet(self):
print("ni hao 1")
def fun(self):
self.age=10
class Dog(Animal1):
def __init__(self,name,age,sex):
super().__init__(name,age) #这种方法就不用再传self了。
self.sex=sex
def greet(self):
print("ni hao")
super().greet()
def fun(self): #一般就是在子类方法中调用父类方法
super().fun()
这种用法一般发生在父类函数被子类同名函数重写后,又还希望调用父类的函数,最常见的例子就是子类初始化时,可以省略写原本父类一已经定义好的那一部分属性,因此直接用super调用父类的初始化函数。
class Parent1:
def greet(self):
print("Hello from Parent1")
class Parent2:
def greet(self):
print("Hi from Parent2")
def sage(self,a):
self.age=a
class Child(Parent1, Parent2):
def __init__(self):
self.age=10
def greet(self):
Parent1.greet(self)
Parent2.greet(self)
def sage(self,a):
Parent2.sage(self,a)
print(Child.__mro__) #查看调用继承的解析顺序
child=Child()
print(child.age)
child.sage(5)
print(child.age) #类的属性名和方法名不要起的一样
在python3中,一般类中直接用父类名.方法名(self,..)调用父类的方法,不用super的方式了,super的方式一般就init用一下,但注意如果多继承它只继承第一个,这个顺序一定要在刚开始定义类就得写好。(用__mro__可以查看类的继承顺序)。