Python作为一门高级语言,其核心是面向对象。
什么是面向对象(Object Oriented)语言呢?
我个人理解的是把现实生活中的物体抽象成一个对象(object),而很多对象有一些共同点,这些具有共同点的对象就构成了一个类(class)。不同类的物体有不同的属性,因此类中有各种变量,每个类也有一定的功能,在Python中以类中的方法(method)来表示。另外,在面向对象编程中还有继承、抽象类等。
总的来说,面向对象型的语言就是对现实世界的一个复杂映射,能够让我们更加灵活地用编程解决实际问题。
(以上纯属个人理解,若有不当,敬请指正!)
6. 面向对象
(1)类
Python中类的关键字是class,每个类有若干变量和方法,Python中由于变量是隐式的,所以类中可以不声明变量。
class Student():
name = ''
age = 0
def do_homework(self):
print("I'm doing homework")
Student为类名,一般类名首字母大写。
name和age都是变量名,若无必要可以不声明。
在类里面定义方法时,必须在参数列表中添加self。类只负责定义,内部不得调用方法。
另外,一般Python习惯一个py文件只写一个类,这是一种编程规范。
注:self只是用于类方法的定义,完全可以换成其他变量名,但为了规范,通常还是使用self,后面提到的cls也是如此。
方法中访问类中变量用self.变量名来访问:
self.age = 18
这里self的用法可以理解为Java中的this。
Python中把模块中的变量称为变量,类里的变量称为数据成员。
(2)构造函数
构造函数无需单独调用,在实例化时自动调用。写法:
def __init__(self):
pass
它不能返回任何参数,只能是默认的None。
(3)实例化对象
我们一般习惯使用构造函数初始化传入参数:
class Student():
name = ''
age = 0
def __init__(self, name, age):
self.name = name
self.age = age
student = Student('Tom', 10)
上述代码最后一行便是实例化对象。Python中不像其他语言,它没有new关键字,直接使用“对象名 = 类名()”来实例化,而括号中传入的参数便是构造函数中除self外的对应参数。
(4)类变量 & 实例变量
构造函数中self.name = name一句,等号前面是实例变量,实例变量改变并不会影响类变量。
类变量通过类名.变量名来访问,也可以通过对象名.变量名来访问,它是类自身的一个属性,与具体的对象无关,因此所有同类对象访问的值是相同的。
Python访问变量时,先寻找实例变量如果没有,则寻找类变量。
(5)实例方法 & 类方法
实例方法参数要带“self”,而类方法要带“cls”且方法前要加装饰器:
@classmethod
def plus_sum(cls):
cls.sum += 1 # 直接用cls调用类变量
print(cls.sum)
其中,@classmethod叫做装饰器,它用于标识此类方法是类方法,否则便是实例方法。
另外,类中还有静态方法,用@staticmethod来标记,其本质上与普通的函数没有区别,参数列表中无需加入self。
(6)成员变量的私有和共有问题
一般为了使成员变量更安全,会将变量设置成私有变量(变量名以双下划线开头,如__score),会使用一个对应的方法传值:
def marking(self, score):
if score < 0:
return '不能是负分'
self.score = score
print(self.name + '本次考试成绩为:' + str(self.score))
如果变量的可见性是public(默认的),则可以在类外部访问和修改,而private就不能。Python中没有public和private关键字,若变量或函数名以__(双下划线)开头则被认为是私有的。
注意: Python是动态语言,可以通过对象.变量名 = 值,给类添加一个变量。因此下面的情况不代表可以修改私有变量的值:student.__score = -1
Python使用__dict__可以打印对象的各种变量
(7)继承
面向对象语言的三大特性:继承性、封装性、多态性。
若两个类相似度较高,其中一个类包含另一个类所有变量,那么就可以使用继承了:
class Student(Human):
括号中即为被继承的类。Student中可以使用Human中的变量。另外,Python可以多继承,这是与其他语言不同的。
如果需要访问父类方法,需要用super关键字:
'''a1.py'''
class Human():
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
'''a2.py'''
from a1 import Human
class Student(Human):
school = ''
__score = 0
def __init__(self, name, age, gender, school):
super(Student, self).__init__(name, age, gender)
self.school = school
除构造函数外,若子类方法和父类方法重名,会覆盖父类方法。
python的面向对象就到此结束了,这里有很多难点,自己要多练习编写。
下次将介绍正则表达式和json。