大家好,前面我们学习了 python 的基础用法,那么从今天开始,我们将学习 python 的面向对象编程,那么什么叫做面向对象的编程呢?
面向对象编程是一种编程范式,它将数据和操作数据的方法封装在对象中,并通过对象之间的交互来实现程序的设计和实现。
在面向对象编程中,程序被组织成一组相互作用的对象,每个对象都有自己的数据和可以处理这些数据的方法。对象通过消息传递的方式进行通信,一个对象可以请求另一个对象执行特定的操作。
面向对象编程的主要特点包括:
封装(Encapsulation):将数据和操作数据的方法封装在对象中,对象对外部隐藏了内部的实现细节,只暴露必要的接口。
继承(Inheritance):通过继承机制,可以从已有的类派生新的类,并对新的类进行扩展或修改。继承可以实现代码重用和层次化设计。
多态(Polymorphism):多态允许使用统一的接口来处理不同类的对象,提高了代码的灵活性和可扩展性。不同的对象可以对同一消息做出不同的响应。
面向对象编程的优点包括代码重用性高、可维护性强、模块化程度高等。它被广泛应用于各种编程语言和领域,如Java、C++、Python等。
那么本篇我怕将带大家进入 python面向对象编程 的大门,让我们一起来看看吧。
举个例子:当我们手洗衣服的时候,我们需要 找盆 - 放水 - 加洗衣粉 - 浸泡 - 搓洗 - 拧干水 - 倒水 - 漂洗N次 - 拧干 - 晾晒。 但是如果我们使用洗衣机洗衣服的话,我们只需要 打开洗衣机 - 放衣服 - 加洗衣粉 - 按下开始按钮 - 晾晒。面向对象我们只需要注意对象是什么,而不必过于关心过程是什么。
总结:面向对象就是将编程当成是一个事物,对外界来说,事物是直接使用的,不用去管他内部的情况。而编程就是设置事物能够做什么事。
在 python 中实现面向对象编程依赖于类和对象,类就相当于是一张图纸,一个事物必须依靠这个图纸才能实现出一个实体,这种类创建出对象的过程也叫做实例化
在 python 中,使用 class 类名():
来创建出一个类。并且类名通常使用大驼峰的形式。
class Washer():
print('这是一个类')
print(type(Washer))
这种类中代码不在函数内部的函数在定义的时候就会执行。也就是说不管我们有没有使用这个类都会执行这个代码。
class Washer():
print('这是一个类')
而通常一个事物被创建出来往往会具有相应的功能,那么在类中我们定义函数使这个类具有某种功能。
class Washer():
def wash_clothes(self):
print('洗衣服')
print(type(Washer))
当我们创建完一个类之后,我们可以使用 对象名 = 类名()
来实例化出一个对象。在实例化出一个对象之后,我们可以使用 对象名.方法
来调用该对象中的方法。
class Washer():
def wash_clothes(self):
print('洗衣服')
washer1 = Washer();
washer1.wash_clothes()
当我们直接打印类名和对象名的时候,会输出什么?
class Washer():
def wash_clothes(self):
print('洗衣服')
washer1 = Washer()
washer2 = Washer()
print(Washer)
print(washer1)
print(washer2)
当我们直接打印对象名的时候,会输出对象名的地址,并且同一个类的不同对象的地址不同。
细心的人可能会发现为什么函数的参数列表中会出现 self 呢?这个 self 不是我手动添加进去的,而是 python 自动补充的,这个 self 表示调用该函数的对象。
class Washer():
hight = 100
weight = 200
def wash_clothes(self):
print('洗衣服')
print(self)
washer1 = Washer();
print(washer1)
washer1.wash_clothes()
washer2 = Washer()
print(washer2)
washer2.wash_clothes()
不仅如此,我们还可以在类当中使用 self.属性
来访问当前类中的属性。
class Washer():
hight = 100
weight = 200
def wash_clothes(self):
print('洗衣服')
print(f'洗衣机的高度是{self.hight}')
washer1 = Washer()
washer1.wash_clothes()
属性代表对象具有的特性,比如高度,重量和价格等,这些都属于对象的属性。
在类外添加属性就相当于什么呢?就相当于我们买手机,当我们拿到手机的时候,我们需要自己下载应用,打造属于我们自己的手机,手机具有我们想要的属性,这就是在类外添加属性的大概意义。我们使用 对象名.属性名 = 值
来在类外添加属性。
class Washer():
def wash_clothes(self):
print('洗衣服')
washer1 = Washer()
washer1.hight = 100
在类中添加属性就相当于,在工厂的时候,制作出来就有的属性,颜色啊、大小什么的,这些就是所有事物都具有的共同属性,只是具体的属性内容有区别。我们使用
属性名 = 值
来在类中添加属性。
class Washer():
hight = 100
weight = 500
def wash_clothes(self):
print('洗衣服')
washer1 = Washer()
在类外访问属性使用 对象名.属性
。
class Washer():
def wash_clothes(self):
print('洗衣服')
washer1 =Washer()
washer1.hight = 100
washer1.weight = 500
print(washer1.hight) # 100
print(washer1.weight) # 500
在类中使用 self.属性
来访问属性。
class Washer():
hight = 100
weight = 500
def print_info(self):
print(f'洗衣机的高度为{self.hight},洗衣机的重量为{self.weight}')
washer1 =Washer()
washer1.print_info()
在 python 类中有很多特殊的方法,他们的格式是 __xx__()
,他们具有特殊的功能。
__ init __() 方法是当我们实例化出一个对象的时候自动调用的方法,不需要我们手动调用,通常用于给对象的属性赋值或者添加属性。
class Washer():
def __init__(self):
self.hight = 100
self.weight = 500
washer1 = Washer()
print(washer1.hight) # 100
print(washer1.weight) # 500
__ init __ 方法也可以传进去参数,用来给对象属性赋值等作用。
class Washer():
hight = 0
weight = 0
def __init__(self,hight,weight):
self.hight = hight
self.weight = weight
washer1 = Washer(100,500)
print(washer1.hight) # 100
print(washer1.weight) # 500
当我们直接使用 print() 函数打印对象名的时候,会输出该对象的地址,但是当我们类中存在 __ str __() 方法的时候,使用 print(对象名) 的时候,输出的是 __ str __() 中return的数据。
class Washer():
def __str__(self):
return '这是一个洗衣机'
washer1 = Washer()
print(washer1)
当我们删除对象的时候,如果该对象中存在 __ del __() 方法的时候,会默认执行盖房啊中的内容。但是实际上,当我们不手动删除对象的时候,也会执行该方法,因为当我们的程序执行完成之后,对象就不会被使用了,会被删除掉。
class Washer():
def __del__(self):
print(f'{self}对象已被删除')
washer1 = Washer()
del washer1