我们一起学python第三天(语法基础、函数与模块及面向对象)

本文对比分析了Python和Java在数据类型声明、类与函数创建、模块定义、类实例化及方法调用、子类与父类继承等方面的差异。重点介绍了Python的特性,如动态类型、缩进语法、模块导入、类的继承方式等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、python中的数据类型的声明方式

在此,我们和java对比讲解,举个例子:

如果定义一个变量:

java 是:     String  name = "zhangsan" ;    //定义一个字符串

                    int age = 20                           //定义一个整数

而python  则是:       name = "zhangsan"

                                   age = 20

进行姓名和年龄打印时:

java可以使用println(name+age) 这样就将其全部转化为String  打印了,

而python 则是  print name,age,如果写 print name+age是会报错的,不能将str和int两个对象连接

2、对于类和函数的创建及模块的定义:

java: 一般情况下类名与文件名保持一致

public class Student{

    public String name ="zhangsan";   //java中没有严格要求缩进,因为{}可以告诉你开始和结束,但是好的书写习惯需要你缩进

    public void printName(){

       println(this.name);

     }

}

而,对于python,则是文件名可以与类名不一样,且一个文件中可以存在多个类

  #python中对于缩进是有严格要求的,其没有{}来告诉你代码的开始和结束,只是有 : 来表示开始,和缩进一起搭配使用

# 创建一个类,类名称第一个字母大写,可以带括号也可以不带括号

class Student:  

  name = "zhangsan"

   def  printName(self):      #定义函数

          print self.name           #根据缩进可知,其是printName函数里的语句

关于模块:可参考 https://baijiahao.baidu.com/s?id=1608487972546304614&wfr=spider&for=pc

关于面向对象,可参考 https://www.cnblogs.com/wangmo/p/7751199.html

3、实例化一个类,并调用其函数方法

import Person                #引入类所在的文件(一般一个文件既是一个模块,在此指的是引入Person.py)

A = Person.Student()         #与java不同的是,其无需使用new,并且python中也没有new A.printName() #方法的调用

A.printName()    #调用方法

在此要强调一下:为什么是Person.Student(),是因为引入的是类所在的文件,而文件中可能含有多个类。因此要定位到具体的类,如果说写的是  from Person   import   Student;就可以直接写成   A  =  Student()

 

4、子类与父类的继承

       要说继承的问题,就要先说一下python中的类。

       python2中的类默认为old style class,要想声明一个new style  class,必须让它继承自一个new style的父类,或者object类。python3中只有new style 类。

      old style class和new style class的区别:

      old style class又叫做经典类,所谓经典就是历史悠久的意思、而old  style class就是新式类。经典类顾名思义历史悠久,那么他的检索就是父类--》父类的父类--》父类的父类的父类,直到找不到父类的父类,才会去找父类的兄弟类。也就是深度检索。而新式类,更注重于新一代,也就是父类--》父类的兄弟类--》直到父类的兄弟类找完找父类的父类。

      为什么要用新式类:因为新式类中父类都继承了object类,因此在进行init时,执行一次,便将所有的父类无重复地init了一遍(这里指的是多继承的情况下),并且新式类修复了经典类中的多继承出现的bug具体如下。

     根据上图可以知道,当搜索save方法时,A中如有save,那么在执行重写时,经典类搜索顺序B-->A,搜索后停止,那么重写的最终是A中的save。这样是不合理的。而新式类,则是先把所有的父类搜索一遍,可见其搜索到C后找到了C中的save就停止了,最终执行的是C中的save,这是合情合理的。

    因此,继承需要用到新式类。父类要继承object类,或其他的新式类。

如下:

#定义类

class Student(object):

  name = 'student'

       def say(self):

       print "i am a",self.name

class College_student(Student):

      def say(self):

      super(College_student,self).say();    #调用父类中的方法

      print "i am a college student"

#运行语句

import Student

A = Student.College_student()

A.say()

运行结果:

 

 

 遇到的问题:

 1、乱码显示

解决办法:文件中代码首行增加:# encoding:utf-8(编码声明注释写成# -*- coding: utf-8 -*-也是可以的,只要满足正则表达式^[ \t\v]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)就OK。)

# encoding:utf-8

s = "中文"

print s

2、IndentationError: unexpected indent

没有严格按照编码的函数块要求进行缩进

3、python中字典中的中文显示问题:

import json

json.dumps(列表名称,encoding='utf-8',ensure_asscii=False)

4、在进行类的创建及方法的调用时,常出现的问题:

(1)输出none的问题:

print(A.printName());#如果说调用的方法中没有设置return返回值,则会输入none

(2)报错:<bound method A.read of <Person.A instance at 0x000000000392FAC8>>

当你将print(A.printName())  改为  print(A.printName)就会报错。因为printName是一个函数方法,而不是属性,所以需要加()

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值