万物皆对象
对象 = 属性 + 方法
在python里,所有东西都有id,对象以id作为标识,包含数据(属性)和代码(方法)
像我这样零基础的到这里肯定一脸懵逼。。。先认识再理解,其实从一开始,我们就接触对象了
对象属性和方法的引用
<对象名>.<属性名>
说到类都会提到的三个特性:封装,继承,多态
类名用大写字母开头
接下来的让我很头疼,因为出现了特殊方法
class Person():
def __init__(self,a,b,c..)
pass
def show(self):
return
a = Person(x,y)
a.show()
构造器 __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 等的方法,甚至改写方法,方便对象进行你想要的特定方法的操作。
现在我们就重写排序这一方法,下面是老师的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 ”小“。
我就问你晕了没?
类也有父子,子类继承父类(也叫基类或超类)。子类有父类的属性和方法,下面给个例子。。
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 的结果是一样的
创建一个类People
包含属性name, city
可以转换为字符串形式(str)
包含方法moveto(self, newcity)
可以按照city排序
创建4个人对象,放到列表进行排序
class People:
def __init__(self, name, city):
self.name, self.city = name, city
def __lt__(self, other):
return self.city < other.city
def __repr__(self):
return f"{self.name},{self.city}"
def moveto(self, newcity):
self.city = newcity
p = []
a = People('Alice', 'Shanghai')
b = People("Sue", "Beijing")
c = People("Javis", "Shenzhen")
d = People("Tom", "Guangzhou")
p.append(a)
p.append(b)
p.append(c)
p.append(d)
print("Original:", p)
p.sort()
print("sorted:", p)
b.moveto('Tianjin')
c.moveto('Wuhan')
print("sorted again:", p)
创建一个类Teacher
是People的子类,新增属性school
moveto方法改为newschool
按照school排序
创建4个教师对象,放到列表进行排序
class Teacher(People):
def __init__(self, name, city, school):
super().__init__(name, city)
self.school = school
def newschool(self, newschool):
self.school = newschool
def __lt__(self, other):
return self.school < other.school
def __repr__(self):
return f"{self.name},{self.school}"
t = []
a = Teacher('Alice', 'Shanghai', '北大')
b = Teacher("Sue", "Beijing", "厦大")
c = Teacher("Javis", "Shenzhen", "波大")
d = Teacher("Tom", "Guangzhou", "地大")
t.append(a)
t.append(b)
t.append(c)
t.append(d)
print("Original:", t)
t.sort()
print("sorted:", t)
a.newschool('技院')
d.newschool('开大')
print("sorted again:",t)
创建一个mylist类,继承自内置数据 类型list(列表)
增加一个方法“累乘”product
def product(self):
返回所有数据项的乘积
class Mylist(list):
def product(self):
p = 1
for i in self:
p *= i
return p