万物皆对象
对象 = 属性 + 方法
在python里,所有东西都有id,对象以id作为标识,包含数据(属性)和代码(方法)
类的特点:封装、继承、多态。类名用大写字母表示
对象属性和方法的引用:<对象名>.<属性名>
类的特殊定义
构造器 init(self):也叫初始化
析构器 del(self):销毁对象时调用
还有很多双下划线围着的,
算术操作符:add,sub,mul,div
大小比较:eq,ne,lt,gt,le,ge
字符串:str,repr,len
详细的介绍请查看:
http://gis4g.pku.edu.cn/python-magicmethod/
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 ”小“。
练习题:
题目1:创建一个类People,包含属性name, city。可以转换为字符串形式(str),包含方法moveto(self, newcity),可以按照city排序,创建4个人对象,放到列表进行排序。
代码:
class People:
def __init__(self,name,city):
self.name=name
self.city=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('Aom','SHai')
b=People('Buddy','GZhou')
c=People('Clia','BJing')
d=People('Doki','SZhen')
p.append(a)
p.append(b)
p.append(c)
p.append(d)
print('original:',p)
p.sort()
print('sorted:',p)
b.moveto('TJ')
c.moveto('WH')
print('sorted again:',p)
题目2:创建一个类Teacher,是People的子类,新增属性school,moveto方法改为newschool,按照school排序。创建4个教师对象,放到列表进行排序。
代码:
class Teacher(People):#子类表示方式
def __init__(self,name,city,school): #继承父类,并添加子类独有属性
super().__init__(name,city) #super函数用来调用已经再子类中重写过的父类方法。
self.school=school
def __lt__(self,other):
return self.school>other.school
def newschool(self,newschool):
self.school=newschool
def __repr__(self):#repr函数返回字符串,str指数据类型
return f'{self.name},{self.school}'
f=[]
a=Teacher('Aom','SHai','上交')
b=Teacher('Buddy','GZhou','地大')
c=Teacher('Cavid','BJing','清华')
d=Teacher('Doki','SZhen','深大')
f.append(a)
f.append(b)
f.append(c)
f.append(d)
print('original:',f)
f.sort()
print('sorted:',f)
b.newschool('复旦')
c.newschool('北大')
print('sorted again:',f)
题目3:创建一个mylist类,继承自内置数据。类型list(列表)增加一个方法“累乘”product。
def product(self):
返回所有数据项的乘积
class Mylist:
def __init__(self,x,y):
self.x,self.y=x,y
def product(self):
return self.x*self.y
a=Mylist(4,7)
print(Mylist.product(a))#缺陷在于仅能计算两个数字的乘积
```python
class Mylist(list):
def product(self):
p = 1
for i in self:
p *= i
return p
nums = list(map(int, input().split()))#一次输入多个数字并用空格分开。int❤
print(Mylist.product(nums))