Python基础——类与对象
目录
一、两种编程思维
1.面向过程编程,看重的是解决问题的过程。
面向过程编程,主要用到的是“函数”知识,将每个过程步骤打包成函数,再依次调用。
2.面向对象编程主要用到的是“类和对象”知识。
3.例:现在接到的一个需求是:做一道西红柿炒鸡蛋。
面向过程的做法:自己按照炒菜的步骤亲手制作一道西红柿炒鸡蛋。
面向对象的做法:制作一台炒菜机器人,然后告诉机器人做一道西红柿炒鸡蛋。
二、类
【类】是一个函数包。类中可以放置函数和变量,然后类中的函数可以很方便的使用类中的变量。
1.类中可以放函数和变量
(1)用法
用def
语句来自定义一个函数,我们用class
语句来自定义一个类。
在类中被定义的函数被称为类的【方法】,描述的是这个类能做什么。我们使用类名.函数名()
的格式,就可以让类的方法运行起来。
在类中被定义的变量被称为类的【属性】。使用类名.变量名
的格式,可以把类中的属性的值提取出来。
# 语法:创建一个名为“ClassName”的类,类名一般首字母要大写,(): 不能丢
class ClassName():
# 如定义一个名为'狗'的类,可以写成class Dog():
# 规范:class语句后续的代码块要缩进
def function1():
# 定义类中的函数1
例1:
class 智能机器人():
胸围 = 33
腰围 = 44
臀围 = 55
def 打招呼():
print('主人你好!')
def 卖萌():
print('主人,求抱抱!')
def 生气():
print('主人,我要报警了!')
print('把类的属性打印出来:')
print(智能机器人.胸围)
print(智能机器人.腰围)
print(智能机器人.腰围)
智能机器人.打招呼()
智能机器人.卖萌()
智能机器人.生气()
(2)类方法与函数的区别
一个是它的调用格式:类.函数名()
比函数名()
多了一个【类.】,但更重要的是,“类”中的函数可以利用“类”中的变量(也就是类方法可以调用类属性)。具体体现在第2节。
2.类方法和类属性可以组合
为了把类中的变量传递给类中的函数,我们需要用到3个特定格式:
① 第一个格式@classmethod
的中文意思就是“类方法”,@classmethod
声明了函数1
是类方法,这样才能允许函数1
使用类属性中的数据。
② 第二个格式cls
的意思是class
的缩写。如果类方法函数1
想使用类属性(也就是类中的变量),就要写上cls
为函数1
的第一个参数,也就是把这个类作为参数传给自己,这样就能被允许使用类中的数据。
③ 第三个格式是cls.变量
。类方法想使用类属性的时候,需要在这些变量名称前加上cls.
。
另外,当类中的函数【不需要】用到类中的变量时,就不要用@classmethod
、cls
、cls.
三处格式,否则就是占着茅坑不拉屎,终端也会给你报错。
'''【正确案例】'''
class 类A():
变量1 = 100
变量2 = 200
def 函数1(): # 【不需要】使用类属性
print('我不需要使用类属性。')
@classmethod
def 函数2(cls): # 【需要】使用类属性
print(cls.变量1)
print(cls.变量2)
类A.函数1()
类A.函数2()
三.类的相关
1.给类方法传参
(1)类方法仅使用外部参数
一首诗 = ['《卜算子》','我住长江头,','君住长江尾。','日日思君不见君,','共饮长江水。']
class 念诗类():
def 念诗函数(参数):
for i in 参数:
print(i)
念诗类.念诗函数(一首诗)
(2)类方法仅使用内部参数
class 念诗类():
一首诗 = ['《卜算子》','我住长江头,','君住长江尾。','日日思君不见君,','共饮长江水。']
@classmethod
def 念诗函数(cls):
for i in cls.一首诗:
print(i)
念诗类.念诗函数()
(3)类方法同时使用内部参数和外部参数
class 念诗类():
一首诗 = ['《卜算子》','我住长江头,','君住长江尾。','日日思君不见君,','共饮长江水。']
@classmethod
def 念诗函数(cls,参数1):
print('念给%s的诗:'%参数1)
for i in cls.一首诗:
print(i)
参数1 = input('念诗给谁听?')
念诗类.念诗函数('张三')
当类方法要使用多个外部参数时,我们要多预设几个参数位置。比如:
class 加100类():
变量 = 100
@classmethod
def 加100函数(cls,参数1,参数2,参数3):
总和 = cls.变量 + 参数1 + 参数2 + 参数3
print('加100函数计算结果如下:')
print(总和)
参数1 = int(input('请输入一个整数:'))
参数2 = int(input('请输入一个整数:'))
参数3 = int(input('请输入一个整数:'))
加100类.加100函数(参数1,参数2,参数3)
2.增加/修改类属性
有两种途径来增加或修改类属性。一种是从内部,用类方法
去增加/修改;另一种是从外部,用类.变量 = xx
直接增加/修改类属性。
(1)从外部增加/修改属性
class 幸运():
@classmethod
def 好运翻倍(cls):
print('好的,我把它存了起来,然后翻了888倍还给你:' + str(cls.幸运数*888))
# 或者这样写也可以:
# print('好的,我把它存了起来,然后翻了888倍还给你:%d' % (cls.幸运数*888))
幸运.幸运数 = int(input('你的幸运数是多少?请输入一个整数。'))
幸运.好运翻倍()
(2)从内部增加/修改属性
class 念诗类():
一首诗 = ['《卜算子》','我住长江头,','君住长江尾。','日日思君不见君,','共饮长江水。']
@classmethod
def 念诗函数(cls):
cls.接收人 = input('请输入你想给谁念诗:')
print('念给'+ cls.接收人 +'的诗:')
for i in cls.一首诗:
print(i)
念诗类.念诗函数()
3.案例
类方法不但能调用类属性,还能直接调用其他类方法。
class 成绩单():
@classmethod
def 录入成绩单(cls):
cls.学生姓名 = input('请输入学生姓名:')
cls.语文_成绩 = int(input('请输入语文成绩:'))
cls.数学_成绩 = int(input('请输入数学成绩:'))
@classmethod
def 计算平均分(cls):
平均分 = (cls.语文_成绩 + cls.数学_成绩)/2
return 平均分
@classmethod
def 评级(cls):
平均分 = cls.计算平均分()
if 平均分>=90:
print(cls.学生姓名 + '的评级是:优')
elif 平均分>= 80 and 平均分<90 :
print(cls.学生姓名 + '的评级是:良')
elif 平均分>= 60 and 平均分<80 :
print(cls.学生姓名 + '的评级是:中')
else:
print(cls.学生姓名 + '的评级是:差')
成绩单.录入成绩单()
成绩单.评级()
在def 评级(cls)
中有一句cls.计算平均分()
,这句代码可以调用类方法计算平均分()
,在这个类方法中,用return语句保存了平均分,然后赋值给def 评级(cls)
中的变量平均分
。这里有个小点要注意,def 评级(cls)
中的平均分
和def 计算平均分(cls)
的平均分
,是两个不同的变量,因为它们在不同的函数下工作,作用域不同。