python学习笔记之---重写与重载

大憨熊 提交于 2019-12-02 18:13:39

重写

重写是指子类重写父类的成员方法。子类可以改变父类方法所实现的功能, 但子类中重写的方法必须与父类中对应的方法具有相同的方法名。也就是说 要实现重写,就必须存在继承。

#重写:子类实现父类的同名方法。

实例1:

class Person():
    def print_info(self):
        print("*************")


class ChinesePerson(Person):
    def print_info(self):  #子类重写父类的print_info方法
        print("________")

p= ChinesePerson() #子类实例
p.print_info()  #子类调用重写方法
p1=Person()  #父类实例
p1.print_info()  #父类调用重写方法

E:\>py -3 a.py
________
*************

 

实例2:

class Person():
  
    def __init__(self,name):
        self.name  = name

    def get_name(self):
        return self.name

    def set_name(self,name):
        if len(name)>5:
            return
        self.name = name

class ChinesePeople(Person):
    def __init__(self,name,nation):
        Person.__init__(self,name)
        self.nation = nation

    def get_nation(self):
        return self.nation

    def set_nation(self,nation):
        self.nation = nation

    def set_name(self,name):
        if len(name)>10:
            return
        self.name = name
        
p = ChinesePeople("李老师","汉")
p.set_name("abcdehed1111")
print(p.name)

p.set_name("ab")
print(p.name)

E:\>py -3 a.py
李老师
ab

 

 

#如果想在子类里面调用父类的同名方法:
class Person():
  
    def __init__(self,name):
        self.name  = name
 
    def get_name(self):
        return self.name
 
    def set_name(self,name):
        if len(name)>5:
            return
        self.name = name
 
class ChinesePeople(Person):
    def __init__(self,name,nation):
        Person.__init__(self,name)
        self.nation = nation
 
 
    def get_nation(self):
        return self.nation
 
 
    def set_nation(self,nation):
        self.nation = nation
 
 
    def set_name(self,name):        #子类中明确的调用父类中被重写的方法
        Person.set_name(self,name)  #写法一
        #super(ChinesePeople,self).set_name(name)  #写法二        #super.set_name()   #写法三
        
p = ChinesePeople("吴老师","汉")
p.set_name("abcd")
print(p.name)
E:\>py -3 a.py
abcd

 

 

 #运算符重写

实例:

#coding=utf-8
class Vector(object) :
  def __init__(self, a, b) :
    self.a = a
    self.b = b

  def __str__(self):
    return 'Vector (%d, %d)' % (self.a, self.b)

  def __add__(self,other) :
    return Vector(self.a + other.a, self.b + other.b)

x =  Vector(3,7)
y =  Vector(1, -10)
print (x + y)
print (str(x))
C:\Users\dell\Desktop\练习\6>py -3 0609.py
Vector (4, -3)
Vector (3, 7)

 

重载

重载方法的名称是相同的,但在方法的声明中一定要有彼此不相同的成
份,以使编译器能够区分这些方法。重载的方法必须遵循下列原则:
➢方法的参数表必须不同,包括参数的类型或个数,以此区分不同方法
体;
➢方法的返回类型、修饰符可以相同,也可以不同。

实例:两个同名的函数,传参不同

def a(x):
    return x
 
def a(x,y):
    return x+y
 
print(a(1,2))
print(a(1))
C:\Users\dell\Desktop\练习\6>py -3 0609.py
3
Traceback (most recent call last):
  File "0609.py", line 8, in <module>
    print(a(1))
TypeError: a() missing 1 required positional argument: 'y'
 
总结:python是没有重载的,第二个同名的函数会把第一个覆盖掉
第一因为python没有类型,第二python有可变参数
 
 
 
 
重写:把父类的方法覆盖掉,使用子类的同名方法。
重载:多个方法名一样,但是他们的参数类型,还有参数个数不一样(java)。
python不支持重载,因为python可以传可变参数,也没有参数类型的定义。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!