?
面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。
类就是一个模板,模板里可以包含多个函数,函数里实现一些功能
对象则是根据模板创建的实例,通过实例对象可以执行类中的函数
?示例1,代码如下
# Myfun类,但是这个类只有一个函数f()
class Myfun: # class 后必须跟冒号:,下一行必须空4格
i = 12345
def f(self): # 类方法必须包含参数self, 且为第一个参数,self代表的是类的实例,后加:
return 'hello world' # return必须再空四格然后写代码,或同时按键ctrl+alt+L
x = Myfun()
# 访问类的属性和方法
print(x.i) # 类x + 物品名i
print(x.f()) # 类x + 人名f
?运行结果如下:
F:\software\pythonProject\venv\Scripts\python.exe F:\software\pythonProject\0104.py?
12345
hello world
进程已结束,退出代码为 0
类的构造方法__init__()
假如init()也是人,但是他是家族和外界联络员,当外界的人想调用自己家族的人,就必须要先告诉他,所以只要家族的人被调用,那么init()就会被先执行,然后由他去告诉那个被调用的人,执行被调用的。
示例2:
class Complex:
def __init__(self, aa, bb): # 必须要有一个self参数
self.a = aa # 空格有严格限制,否则报错
self.b = bb
x = Complex(3.0, 4.5) # 输出结果:3. -4.5
print(x.a, x.b)
输出结果:3.0 4.5
示例3:
class People:
name = ''
age = 0
# 定义私有属性,私有属性在类外部无法直接进行访问
__weight = 0
def __str__(self):
return self.__weight
# 定义构造方法
def __init__(self, n, a, w): # self为实例化本身,类似于js的this
self.name = n
self.age = a
self.__weight = w
def speak(self):
print("%s 说:我 %d 岁。" % (self.name, self.age))
'''
("%s 说:我 %d 岁。")此时的%s和%d均为参数,行参,需要在后面给他加上实参,需要加%
比如("%a 前面为要传入的参数,后面这个是传入的实参"%(self.name ###此时就是实参))
'''
# 实例化
p = People('cassie', 10, 3)
p.speak()
结果为:cassie 说:我 10 岁。
?
示例4:
class People:
name = ''
age = 18
sex = 'f'
def __str__(self): # 把名字直接展示出来,在直接print实例化对象时
return self.name
def __init__(self, name): # 接收参数
self.name = name # 修改上面的name属性的值
# print('this is start')
def like_apple(self): # 需要调用此函数
if self.sex == 'f':
print('女性爱吃苹果')
elif self.sex == 'n':
print('男性不爱吃苹果')
else:
print('没有性别,无法判断')
print(self.name, self.age,'岁')
a = People('lucy') # 实例化
a.like_apple() # 调用自己写的函数
'''
输出结果为:
女性爱吃苹果
lucy 0
'''
print(a) #因为上面写了__str__这个方法,所以在print时,直接返回了名字
?结果为:女性爱吃苹果
lucy 18 岁
lucy
在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数self, 且为第一个参数,self代表的是类的实例。
self:类的方法与普通的函数只有一个特别的区别——必须有一个额外的第一个参数名称, 按照惯例它的名称是self。
类的实例:是将类应用在实例场景之中,比如有个类里的函数是f,假如这个f具有print某一时刻的天气状况的能力,那么如果我需要这个f来print一下今天12点的天气,那么让他打印今天12点的天气这个动作,就是类的实例化,让类中的函数具有的能力变成真实的动作。
面向对象的三大特性是指:封装、继承和多态。
一、封装
封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。
所以,在使用面向对象的封装特性时,需要:
将内容封装到某处
从某处调用被封装的内容
二、继承
继承,面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容。
例如:
猫可以:喵喵叫、吃、喝、拉、撒
狗可以:汪汪叫、吃、喝、拉、撒
如果我们要分别为猫和狗创建一个类,那么就需要为 猫 和 狗 实现他们所有的功能,如下所示:
上述代码不难看出,吃、喝、拉、撒是猫和狗都具有的功能,而我们却分别的猫和狗的类中编写了两次。如果使用 继承 的思想,如下实现:
动物:吃、喝、拉、撒
? 猫:喵喵叫(猫继承动物的功能)
? 狗:汪汪叫(狗继承动物的功能)
三、多态?
?Pyhon不支持Java和C#这一类强类型语言中多态的写法,但是原生多态,其Python崇尚“鸭子类型”。