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是一个函数方法,而不是属性,所以需要加()