前言:这一节可大概讲了类的基本使用。后三节课换了一位老师讲课,这位老师很注重实际应用,前大半节课都在讲实际例子。也有人抱怨拖时间没什么干货,我感觉各有道理。我想听多点干货,也不想错失实践技巧。老师的讲课各有不同,自适应比较好。
笔记依据 / 老师讲义:
课节4: Python面向对象(上)
https://aistudio.baidu.com/aistudio/projectdetail/1525879
# 读取文件内容
def get_coach_data(filename):
with open(filename) as f:
line = f.readline()
return line.strip()
需求:选手的最好的三次成绩
”的例子。菜鸟教程 - Python3 面向对象
https://www.runoob.com/python3/python3-class.html
- 降低复杂性-》更少的bug-》提高可维护行;
- 类可以将数据与函数绑定在一起,使代码模块化;
- 调用数据和函数,使用对象名.的方式,使代码更加优雅。
代码 通常称为 类的 方法,
数据 通常称为 类的 属性,
实例化的对象 称为 实例。
__init__
方法(类中的函数都称作方法)很重要,这个方法的专业名词为“构造方法。”每次创建实例时都会执行一次,用来给实例属性赋值,也可以调用执行函数。class Athlete:
”。(还是加比较好)class Athlete:
#运动员集训了,要买东西的同学要把地址改一下
address = '中国足球协会训练基地xx街xx号' #我也不知道为什么要写这个,作业提示说写的'
def __init__(self,a_name,a_dob=None,a_times=[]):
self.name = a_name
self.dob = a_dob
self.times = a_times
def top3(self):
self.time = self.sanitize(self.time)
return sorted(self.time)[0:3:1]
# print(f'姓名:{self.name};日期:{self.dob};前三次成绩:{sorted(self.time)[:3:1]}')
def sanitize(self,time_string):
Set = set()
for i in time_string:
if '-' in i or ':' in i:
i = i.replace('-','.',1) # 无论有没有都可以替换,妙啊
i = i.replace(':','.',1)
Set.add(i)
return list(Set)
@classmethod
def changeAddress(cls):
cls.address = '中国田径训练基地xx街xx号'
address = cls.address+'1' # 证明这样不可以调用
Athlete.address = cls.address+'2' # 证明这样也可以调用
# self.address = cls.address+'3' # 证明这个会报错
him = Athlete('him',20000311,3.14)
print(him.address)
Athlete.changeAddress()
print(him.address)
class.__dir__()
打印所有名字,就可以找到被改后的名字了。class Person(object):
def __init__(self, name, age):
self.__name = name
self.__age = age
def getAge(self):
return self.__age
def setAge(self, age):
self.__age = age
p1 = Person("张三", 23)
p1.setAge(24)
print(p1.getAge()) # 打印结果:24
print(p1.__dir__())
# 打印结果:
"""
['_Person__name', '_Person__age', '__module__', '__init__', 'getAge', 'setAge',
'__dict__', '__weakref__', '__doc__', '__repr__', '__hash__', '__str__', '__getattribute__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__','__new__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__','__format__', '__sizeof__', '__dir__', '__class__']
"""
p1._Person__age = 30
print(p1._Person__age) # 打印结果:30
print(p1.getAge()) # 打印结果:30
__init__
和__dir__
都算是。__call__
,可直接使用实例名()
的形式调用。(初学时被这种操作完全搞蒙了,不知道是类还是函数,甚至数据变量。后来有了概念:“所有都是对象”,类名,函数名,本质也是个变量。就感觉顺畅多了。)