前言:这一节可大概讲了类的基本使用。后三节课换了一位老师讲课,这位老师很注重实际应用,前大半节课都在讲实际例子。也有人抱怨拖时间没什么干货,我感觉各有道理。我想听多点干货,也不想错失实践技巧。老师的讲课各有不同,自适应比较好。
目录
———————————————
《百度飞桨领航团零基础Python速成营》 课程笔记 —— 04
笔记依据 / 老师讲义:
课节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
1)使用类的好处
- 降低复杂性-》更少的bug-》提高可维护行;
- 类可以将数据与函数绑定在一起,使代码模块化;
- 调用数据和函数,使用对象名.的方式,使代码更加优雅。
2)规范名词
代码 通常称为 类的 方法,
数据 通常称为 类的 属性,
实例化的对象 称为 实例。
- 我自己在看文献时,时常搞混这些名词,除了这些,还有实例的属性,实例的方法等,扣定义描述远不如一段简单明了的代码来得清晰。
3)定义类 & 使用类 & 类属性
__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)
- 注意,类属性的调用,有特定的作用顺序。如果忘记了就打开python敲一遍。
4)私有化 - (隐藏化) dir
- 专业术语称“私有”,指不能被外部直接调用(属性/变量 ,和方法/函数,都可以私有化),隐藏起来了。其实本质上只是改了个名字,如果使用改后名字就可以直接调用了。使用内置方法
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
5)内置方法
- 在类中加了下划线的,一般都被称为内置(个人理解),其中
__init__
和__dir__
都算是。 - 在以往的课程中还学过
__call__
,可直接使用实例名()
的形式调用。(初学时被这种操作完全搞蒙了,不知道是类还是函数,甚至数据变量。后来有了概念:“所有都是对象”,类名,函数名,本质也是个变量。就感觉顺畅多了。) - 更多内置方法不介绍了,自查。