Python3学习(三)

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。

发布了7 篇原创文章 · 获赞 10 · 访问量 2657

猜你喜欢

转载自blog.csdn.net/weixin_41076275/article/details/104144673