MOOC —— Python语言基础与应用 by 北京大学 第八章 面向对象

43、什么是对象

万物皆对象
对象 = 属性 + 方法
在python里,所有东西都有id,对象以id作为标识,包含数据(属性)和代码(方法)
像我这样零基础的到这里肯定一脸懵逼。。。先认识再理解,其实从一开始,我们就接触对象了
对象属性和方法的引用
<对象名>.<属性名>

44、类的定义与调用

说到类都会提到的三个特性:封装,继承,多态
类名用大写字母开头
接下来的让我很头疼,因为出现了特殊方法

class Person():
	def __init__(self,a,b,c..)
		pass
	def show(self):
		return 
a  = Person(x,y)
a.show()
45、类定义中的特殊方法

构造器 __init__(self):也叫初始化
析构器 __del__(self):销毁对象时调用
还有很多双下划线围着的,
算术操作符:add,sub,mul,div
大小比较:eq,ne,lt,gt,le,ge
字符串:str,repr,len
详细的介绍请查看:
http://gis4g.pku.edu.cn/python-magicmethod/


为了理解这一节,,首先跟着老师的ppt把代码打一遍。然后看着代码听老师讲课,就容易很多了。下面给出两个代码,分别执行相同的命令,看看结果有助于理解。Learn python the hard way!

class Force:
	def __init__(self,x,y):
		self.fx,self.fy =x,y
	def show(self):
		print('%s,%s' % (self.fx,self.fy))
	def add(self,force2):
		x=self.fx+force2.fx
		y = self.fy+force2.fy
		return Force(x,y)
	__add__ = add
	def __str__(self):
		return '%s,%s' % (self.fx,self.fy)
	def __mul__(self,n):
		x,y = self.fx * n,self.fy*n
		return Force(x,y)
	def __eq__(self,force2):
		return (self.fx == force2.fx) and (self.fy == force2.fy)

把上一段代码部分注释掉

class Force:
	def __init__(self,x,y):
		self.fx,self.fy =x,y
	def show(self):
		print('%s,%s' % (self.fx,self.fy))
	def add(self,force2):
		x=self.fx+force2.fx
		y = self.fy+force2.fy
		return Force(x,y)
	#__add__ = add
	#def __str__(self):
	#	return '%s,%s' % (self.fx,self.fy)
	#def __mul__(self,n):
	#	x,y = self.fx * n,self.fy*n
	#	return Force(x,y)
	def __eq__(self,force2):
		return (self.fx == force2.fx) and (self.fy == force2.fy)

我们对这两段代码执行以下命令:

a = Force(0,1)
b = Force(3,4)
print(a)
a.fx
c = a + b
c = a.add(b)
d = a*b
print(c)
print(d)

本人的理解:注释掉特殊方法后,无法进行 c = a+ b或a*b的运算,要相加,就只能用定义的add 方法。特殊方法就是给你创建的对象自动拥有str, add 等的方法,甚至改写方法,方便对象进行你想要的特定方法的操作。

46、自定义对象的排序

现在我们就重写排序这一方法,下面是老师的ppt里的Student类,注意第二个注释,重点

class Student:

    def __init__(self, name, grade):
        self.name, self.grade = name, grade

       # 内置sort函数只引用 < 比较符来判断前后
    def __lt__(self, other):
        # 重点,成绩比other高的,排在他前面
        return self.grade > other.grade
        # 按照姓名来排序
        # return self.name < other.name

    # Student的易读字符串表示
    def __str__(self):
        return "(%s, %d)" % (self.name, self.grade)

    # Student的正式字符串表示,我们让它跟易读表示相同
    __repr__ = __str__  # __repr__(self):  返回一个用来表示对象的字符串

# 构造一个Python List对象
s = list()

# 添加Student对象到List中
s.append(Student("Jack", 80))
s.append(Student("Jane", 75))
s.append(Student("Smith", 82))
s.append(Student("Cook", 90))
s.append(Student("Tom", 70))
print("Original:", s)
s.sort()

print("Sorted:", s)

研究了几小时后,我的理解 :我们平时使用sort()或sorted()默认是从小到大排序。而在这里,sort是根据特殊方法 __lt__ 里返回值是否为True来决定谁在前面。return self.grade > other.grade 假如self.grade的值 比other.grade的值大,这里返回的就是True,那么self.grade就排在前面,也就是sort认为它比other ”小“。

我就问你晕了没?

47、类的继承

类也有父子,子类继承父类(也叫基类或超类)。子类有父类的属性和方法,下面给个例子。。

class 父类:
	头发 = 黑色
	眼睛 = 棕色
	def 老司机(self):
		pass    # pass的作用是留行,以后编写
class 子类:
	# 不用定义头发的变量,默认就继承了跟父亲一样是黑色
	眼睛 = 蓝色  # 儿子可以有自己的属性,覆盖掉父亲的属性
	# 继承父亲的老司机技能,无需重新定义
	def 小司机(self): # 给儿子加个父亲没有的方法
		pass	

关于self,它代表对象实例。
<对象>.<方法>(<参数>)= <类>.<方法>(<对象>,<参数>),还记得第一个例子么

a = Force(0,1)   # 创建对象a
b = Force(3,4)   # 创建对象b
c = a.add(b)         # <对象>a.add<方法>(b<参数>)
d = Force.add(a,b)   # 类.方法(对象,参数)
print(c,d)

最后你发看到 c 和 d 的结果是一样的

48、上机练习:类和对象

创建一个类People
包含属性name, city
可以转换为字符串形式(str
包含方法moveto(self, newcity)
可以按照city排序
创建4个人对象,放到列表进行排序

创建一个类Teacher
是People的子类,新增属性school
moveto方法改为newschool
按照school排序
创建4个教师对象,放到列表进行排序

创建一个mylist类,继承自内置数据 类型list(列表)
增加一个方法“累乘”product
def product(self):
返回所有数据项的乘积

猜你喜欢

转载自blog.csdn.net/byakki/article/details/86614419