前言
当使用同样的重名的方法会出现怎样的情况。
当想要将类以外的方法添加到类里面时该怎样操作。
一、方法没有重载
1.介绍
在其他语言中,可定义多个重名的方法,只要保证签名唯一即可。方法签名包含3个部分:方法名,参数变量,参数类型。
Python中,方法的参数没有生命类型(调用时确定参数的类型),参数的数量也可以由可变参数控制。因此,Python中没有方法的重载。定义一个方法即可有多种调用方式,相当于实现了其他语言的方法的重载。
如果我们在类体中定义了多个重名的方法,只有最后一个有效。
2.实例
class hello:
def say_hi(self): #被后面重名所覆盖
print("hello")
def say_hi(self,name): #覆盖前一个say_hi
print("hello,{0}".format(name))
a=hello()
#a.say_hi() 报错,没有传参数
a.say_hi("123")
结果:
二、方法的动态性
1.介绍
Python时动态语言,我们可以动态的为类添加新的方法,或者动态的修改类的已有的方法。
2.实例
class person :
def shout(self):
print("i can shout ")
def run(self): #被下一个同名字的run方法给覆盖掉
print("i can run ")
def work_01(s): #此方法在person对象的外部
print("{0}在工作。".format(s))
def shout02(s): #此方法在person对象的外部
print("i can shout loudly")
a=person()
a.shout()
person.shout(a) #两种方法的使用
a.run()
person.run(a) #两种方法的使用
print("$"*12)
#a.work_01(123) 报错,work不在对象里面
person.work=work_01 #将work_01方法赋给对象里面的work新方法
a.work() #括号里不加参数,因为原本的对象就没给传参
person.shout=shout02 #直接覆盖掉对象里面的方法的shout
a.shout() #也不能传参
结果:
3.分析
在外部定义新的方法,可以直接将外部方法赋给类的内部,就可以使用,但受到原本对象无参数限制,所以就不能传参,如果非要输出参数就会直接输出对象本身(例如<__main__.person object at 0x000001B107DCBFD0>在工作。)。
当将类外部方法替换掉内部的方法时,也仅需用赋值操作即可。也要注意参数问题。
总结
方法没有重载和方法的动态性都体现了Python的动态性。