1方法重载1.1Python不支持方法重载在强类型语言(如:C语言,Java语言)中,可以定义对于同名的多个方法,只要保证方法的签名是唯一的即可。方法签名由三部分组成:方法名参数个数参数类型在Python中,方法的参数没有声明的类型(参数的类型只能在调用时确定),参数的个数也可以是由可变参数控制。因此,python中没有方法重载。定义一个方法可以有多个调用方法,相当于用其他语言实现方法重载。但是这种方式,与强类型语言相比,可能不是那么直观,因为多种情况要在一个函数中处理。如果我们在类体中定义了多个同名方法,那么只有最后一个方法有效。建议:不要使用同名方法1.2代码说明示例代码:classPerson:defsay_hi(self):print("hello")defsay_hi(self,name):print("{0},hello".format(name))p1=Person()p1.say_hi("niefajun")print("--"*20)p1.say_hi()运行结果:niefajun,hello---------------------------------------Traceback(最近调用最后):文件“test.py”,第13行,在p1.say_hi()TypeError:say_hi()missing1requiredpositionalargument:'name'程序描述:类Person中定义了两个方法,但是这两个方法同名,都是say_hi,根据前面的解释,只有最后一个生效,那么相当于只定义了say_hi(self,name)方法。第一次调用p1.say_hi("niefajun"),可以对应参数,所以可以正常输出内容。第二次使用p1.say_hi(),没有参数,相当于少了一个参数,所以提示错误信息:TypeError:say_hi()missing1requiredpositionalargument:'name'2动态方法python是一门动态语言,我们可以动态地为一个类添加新的方法,或者动态地修改一个类已有的方法。2.1代码说明示例代码:#定义一个独立的公共方法defplay_game(self):print("Playagameandtakeabreak")classPerson:def__init__(self,name):self.name=namedefwork(self):print("Workhard")Person.play=play_gamep1=Person("p1")p1.work()p1.play()运行结果:努力工作,玩游戏,休息程序说明:对象p1是一个类Person的实例,虽然在Person类声明中只定义了一个work方法,但是后面通过动态赋值的方式添加了一个play属性,指向函数play_game,其实就是添加了一个play的实例方法。所以后续执行p1.work()和p1.play()都能输出正确的结果。说明:虽然可以通过methoddynamics动态添加方法,但在实际开发中不建议这样做,会导致代码可读性降低,存在潜在风险。3、__slots__类变量限制动态Python可以很方便的实现属性和方法的动态,使用起来很方便,但是也会造成一定的不确定性,所以使用Python中的__slots__属性来限制属性和方法的动态。示例代码:classPerson:"""使用__slots__限制Person只能添加一个名为"""的属性__slots__=('name',)def__init__(self,name):self.name=namep1=Person("聂法君")print(p1.name)print("--"*20)p1.age=100print(p1.age)运行结果:聂法军-----------------------------------------追溯(最近一次调用最后一次):文件“test.py”,第12行,在p1.age=100AttributeError中:'person'对象没有属性'age'程序说明:在定义Person类时,使用了__slots__属性,该属性仅限于一个字段名,不允许动态添加其他字段。程序运行,之前正常实例化对象p1,打印p1.name属性,结果正常。后来动态复制的age属性为100,由于__slots__的限制,无法动态添加属性,所以报错:AttributeError:'Person'objecthasnoattribute'age'。备注:更多精彩博客请访问:聂发钧的技术博客对应视频教程请访问:python400完整markdown笔记请访问:python400_learn_github