我们的目标是:通过这一套资料学习下来,通过熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。
上篇文章我们讨论了函数的相关知识。今天我们将学习一下面向对象的基础知识。
python 是面向对象的设计语言,面相对象object oriented 缩写字母OO,面向对象编程object oriented programming 缩写 OOP。面向对象编程(OOP)是一种程序设计思想,它利用"对象"来封装数据(属性)和操作那些数据的方法,并通过"继承"和"多态"来定义不同的类以及它们之间的关系。
在Python中,可以通过定义类(class)和实例化对象(object)来实现面向对象编程。
1、对象的理解
对象是一个抽象的概念,用于表示任意存在的事物。世间万物皆为对象。
通常将对象划分为两部分,即静态部分和动态部分。静态部分被称为:"属性",任何对象都具备自身属性,如人的性别。动态部分指对象的行为,即对象执行的动作,如人可以行走,鸟儿可以飞翔。
注意:在python中,一切都是对象,也就是说,不仅是具体的事物被称为对象,字符串、列表、字典等都被称作对象。
在Python实际应用中,对象是类的实例。类定义了对象的基本结构和行为,而对象则是具体的实体,拥有类所定义的属性和方法。
举例说明:
#类的练习
class Person: #类的名称一般第一个字母大写
def init(self,name,age):#构造方法
self.name = name
self.age = age
def greet(self):
print("hello,I am {:s} and I am {:d} years old.".format(self.name,self.age))
#通过.format()来输出对应的形式
xiaomi=Person("xiaomi",10) #创建对象的实例
xiaomi.greet() #通过实例调用greet 方法
输出结果:
2、类的理解
类是封装对象的属性和行为的载体。反过来说,具有相同属性和行为的一类实体被称为类。
类的定义:在Python中,使用class关键字来定义一个类。类体中可以包含类变量、方法、属性等。类变量在整个实例化的对象中是公用的,而实例变量则是在每个实例中独立的。
类的属性和方法:类可以包含属性和方法。属性用于存储数据,而方法用于执行操作。类变量在所有实例之间共享,而实例变量则每个实例都有自己的一份拷贝。
类的实例化:定义类之后,需要创建类的实例才能使用。创建实例的过程称为实例化。实例化时,可以使用类名和参数列表来创建对象。
如定义一个大雁类,即Geese,在该类中,可以定义每个对象共有的属性和方法;而一只要从北方飞往南方的大雁则是大雁类的一个对象,即wildGeese,对象是类的实例。
class Geese:
''' 大雁类的练习
''' def init(self,claw,wing):#有属性像翅膀,爪子
self.claw = claw
self.wing = wing
def fly(self):
print("I LIKE FLY!")
claw1 = "爪子很有力,是圆形的"
wing1 = "翅膀很长"
southGeese = Geese(claw1, wing1) #创建大雁类的实例
southGeese.fly()
输出结果:
3、面向对象程序设计的特点
面向对象设计由3个主要的特征,即封装、继承、多态。
1)封装性
封装是面向对象编程的核心思想,将对象的属性和行为封装起来,而将对象的属性和行为封装起来的载体就是类。通过封装思想保证了类内部数据结构的完整性,使用该类的用户不能直接看到类中的数据结构,而只能执行类允许公开的数据。
封装是面向对象编程(OOP)的四大基本原则之一,旨在通过私有变量和私有方法的设置,实现隐藏对象的属性和实现细节,允许外部通过公共的访问方式与内部进行交互,同时限制直接访问对象的内部状态,以保护数据的安全性和完整性。
在Python中,封装主要通过以下几种方式实现:
- 私有变量:通过在变量名前添加双下划线(__),如__xxx,可以将变量设置为私有。这种方式在类内部可以使用,但在类外部无法直接访问。例如,self.__A是一个私有变量,只能在类内部使用。
- 私有方法:类似地,通过在方法名前添加双下划线(__),如__foo,可以将方法设置为私有。私有方法同样只能在类内部使用,外部无法直接调用。
- property属性:除了私有变量和私有方法外,Python还提供了property属性,这是一种特殊的属性,可以将一个方法变成属性调用,同时保留方法的灵活性。
封装的目的在于:
- 保护隐私数据和方法,明确内外区分。
- 隔离复杂的实现方法,使得对象的使用更加简单。
- 提高代码的复用性。
- 隔离变化和复杂性。
- 提高安全性。
通过封装,我们可以控制属性的读和修改的访问级别,将抽象得到的数据和行为结合成一个有机的整体,即类。这样不仅增强了代码的可读性和可维护性,还确保了数据的一致性和完整性。
2)继承性
在Python中,类可以继承自一个或多个父类。子类会继承父类的所有公有(public)和保护(protected)属性与方法。在Python中,继承性可以通过关键字class和冒号:来声明。
举例说明:
#类的练习
class Person: #类的名称一般第一个字母大写
def init(self,name,age):#构造方法
self.name = name
self.age = age
def greet(self):
print("hello,I am {:s} and I am {:d} years old.".format(self.name,self.age))
#通过.format()来输出对应的形式
#继承的练习
class Child(Person): #继承Person 类
def goschool(self): #添加自己的行为函数
print("I am a child,I need to go to school!")
a_child = Child("xiaohua",7) #复用父类的属性
a_child.greet()#复用父类的方法
a_child.goschool()
在这个例子中,Child类继承了Parent类。Child类继承了Parent类的greet()方法,并且可以有它自己的goschool()方法。当我们创建Child类的实例并调用它的方法时,它能够调用自己的方法以及从Parent类继承的方法。
3)多态性
将父类对象应用于字类的特征就是多态。子类继承了父类特征的同时,也具备了自己的特征,并且实现不同的效果,这就是多态话的结构。像上面继承性的例子中,Child 类就有自己的行为特征:goshcool。
再举个简单例子:
class Animal:
def speak(self):
raise NotImplementedError("子类必须实现该方法")
class Dog(Animal):
def speak(self):
return "汪汪汪啊"
class Cat(Animal):
def speak(self):
return "喵喵喵啊"
def animal_speaks(animal):
"""接受所有Animal类的子类实例,并调用它们的speak方法"""
print(animal.speak())
# 使用
dog = Dog()
cat = Cat()
animal_speaks(dog) # 输出: 汪汪汪啊
animal_speaks(cat) # 输出: 喵喵喵啊
输出的结果:
这个例子展示了如何在Python中使用多态性。Animal 类定义了一个必须由子类实现的 speak 方法。Dog 和 Cat 类继承了 Animal 类并实现了 speak 方法。animal_speaks 函数接受任何 Animal 类的子类实例,并调用它们的 speak 方法。这样,无论传递什么子类实例,animal_speaks 函数都能正确地调用 speak 方法。
今天先写学习到这里了,每天进步一点点。今天也要加油啊!