Python类的单继承使用详解

版权声明:本文为博主原创文章,未经博主女朋友允许不得转载。 https://blog.csdn.net/qq_26442553/article/details/81748906

1.为什么要有类的继承性?(继承性的好处)

继承性的好处:
①减少了代码的冗余,提供了代码的复用性
②提高了程序的扩展性 
③(类与类之间产生了联系)为多态的使用提供了前提

2.类继承性的格式:单继承和多继承

Python支持单继承和多继承。这点跟强类型语言是有所不同的。
python中继承的格式如下:用()
   class 子类名B(父类名1,父类名2):  #只要区别单继承还是多继承
         子类体
------------代码演示---------------------------------------------------------------------
#父类Person
class Person(object):
    def __init__(self,name ,age):
        self.name = name
        self.age = age
#子类,Studnent
class Student(Person):
    def __init__(self,grade):
        self.grade = grade

    def p(self):
        print("这是子类的方法")

3.子类继承了父类以后有哪些特性?(以单继承为例)

#父类Person
class Person(object):
    country = "china"
    __sex = "male"
    def __init__(self,name ,age):
        self.name = name
        self.__age = age  #父类的私有属性
    #给私有属性提供get和set方法
    def getSex(self):
        return self.__sex
    def setSex(self,sex ):
        self.__sex = sex
    def getAge(self):
        return self.__age
    def setAge(self,age):
        self.__age = age
    #父类的共有方法
    def p(self):
        print("这是父类的方法")

    def p1(self):
        print("这是父类的方法p1")
    #父类的私有方法
    def __p(self):
        print("父类的私有方法")
#子类,Studnent
class Student(Person):
#1.子类默认继承了父类的构造方法__init__(),创建对象时默认调用.但是子类也可以有直接的构造方法__init()
#1.若子类有自己的init__()__方法,则该方法的参数个数要大于等于父类的个数,否则报错,因为会默认调用父类的。
    def __init__(self, name, age, grade):#如果重写了__init__ 时,实例化子类,就不会调用父类已经定义的 __init_
         Person.__init__(self, name, age)  # 调用父类的构造方法,实现子类初始化,如果不调用要分别赋值
        #super().__init__(name,age) #注意,也可以用super()调用父类的构造方法,但这个时候参数不用写self了。
         self.grade = grade
#2.子类中,有一个和父类中相同名字的方法,在子类中的方法会覆盖掉父类中同名的方法,也叫方法的重写(override)
    def p(self):
        print("这是子类的方法")

#--------创建对象--------------------------------------------------------------------
stu = Student("tom",11,88)
#3.子类继承了父类的所有属性,但是私有属性不能直接调用,要通过方法。况且私有属性连父类自己都不能直接调用
print(stu.country,stu.name,stu.grade)
#print(stu.age,stu.sex)  #调用私有属性报错,可以用 get/set方法调用私有属性。
print(stu.getAge(),stu.getSex())

#4.子类继承了父类的所有方法,同样私有方法不能直接调用(父类自己都不能直接调用,何况子类。)。

stu.p()  #如果父类中和子类有同名的方法,那么默认调用子类的,子类覆盖父类的方法了。
stu.p1() #直接调用父类中有,子类没有的方法。
=======执行结果============================================================================
china tom 88
11 male
这是子类的方法
这是父类的方法p1

总结:1.子类在继承父类时,默认继承了父类的 __init__()方法,如果子类没有重写__init__方法,则在创建对象时默认调用父类的该方法。但如果重写了__init__ 时,实例化子类时,就不会调用父类已经定义的 __init_

            2.因为子类默认继承了父类的构造方法,所以子类可以不需要重写__init__()方法。如果子类重写了自己的__init__()方法,那么子类该方法的参数个数要大于等于父类的个数(要包含父类的参数)。否则,报错。因为python中一个类中只能有一个init方法,不支持构造方法的重载。

            3.注意:可以用super().的形式调用父类的构造方法,但这个时候参数不用写self了,注意跟直接用父类名.形式调用的区别。

            4.子类继承了父类所有的属性,包扣私有属性,只是私有属性不能直接去调用,而是要通过get/set方法进行调用。

            5.子类继承了父类的所有方法,同样 私有方法不能外部直接调用。 

           6.同样如果父类还有父类,那么子类也会继承父类的父类所有方法和属性(注意私有属性和 方法同样访问不了)

 

猜你喜欢

转载自blog.csdn.net/qq_26442553/article/details/81748906