十分钟学会Python中的面向对象
面向对象为什么难?
提到学习Python语言编程中的难点,面向对象肯定算是一个。虽然面向对象很好的将程序生活化,现实化了,更符合人类的思考模式,但是面向过程语言顺序的执行流程,单纯的条件因果关系无疑更适合初学者掌握。面向对象编程相对更大的代码量也让初学者头痛不已。
类和对象
学习面向对象编程,首先要理解“类”和“对象”这两个名词。
我们先看看官方定义:
类是具有相同特征的同一类事物的抽象。
对象是类的具体表现形式。
有没有什么更简单的方法理解这两个概念呢?
有!!
如果说人类是一个【类】那么你就是一个【对象】,我是另一个【对象】。
那我们再举两个例子:
颜色是一个类,红色是一个对象,白色是另一个对象。
超级英雄是一个类,美国队长是一个对象,钢铁侠是另一个对象。
Python中的类和对象
在Python语言中,类是一个自定义的数据类型,对象是一个由该类创建的一个具体变量。
类是构建对象的模板,规范了对象的特征和行为。也就是说类定义了对象是什么样子的,拥有哪些功能,存储什么样的数据,能对数据做哪些处理。
就像是制造一个机器人,先要画出机器人的设计图纸,然后再生产机器人去完成具体的工作。这个图纸就是类。
# 创建一个类用class关键字,Rect是类的名字,类名采用首字母大写的驼峰命名法
# 当名称由多个单词构成时写作FirstSecondThird
class Rect:
# init方法,用于初始化刚刚创建的对象
def __init__(self, width, length):
# self.__width和self.__length是类的字段,规定了类所创建的对象存储哪些数据
self.__width = width
self.__length = length
# 成员方法,描述了类或对象处理数据的功能。
def perimeter(self):
return self.__width * self.__length
真正处理数据,则需要通过类创建对应的对象
# 创建类对应的对象 rect是对象的引用,通过引用我们就可以创建对象
# 3和4则是为__init__方法传入参数,设置两个字段的值
rect = Rect(3, 4)
# 通过引用调用方法,实现
ret = rect.perimeter()
写一个面向对象的程序
与面向过程编程,直接编写流程处理数据不同,面向对象编程就像是将生活逻辑映射到程序当中,创建出各种各样的机器人,分工合作,去完成程序的需求。
这里有一个我自己设计的例子。
我们去完成这样一个程序,小明手里有两张牌,左手“红桃A”,右手“黑桃K”,如果让小明交换双手的牌,求交换之后,左右手的牌各是什么?
首先要找出需求中的对象:
小明,两张牌,这样看是三个对象。手是小明的一部分。
小明,两只手,两张牌,这样看是五个对象,这两种方式都对。
设计对象,也就是编写对象对应的类:
# 牌的类
class PokerCards:
def __init__(self, color, size):
# 字段是牌的花色和大小
self.color = color
self.size = size
# 这个方法使得牌的对象可以被转换成字符串。转换的结果就是该方法的返回值
def __str__(self):
return "%s:%s" % (self.color, self.size)
# 手的类
class Hand:
# 字段的另一种创建方式,创建在__init__方法之外,手中可以抓一张牌
pokerCard: PokerCards
# 人的类
class Human:
def __init__(self):
# 人的字段是人拥有两只手
self.__leftHand = Hand()
self.__rightHand = Hand()
# 拿牌
def catch_cards(self, card1, card2):
self.__leftHand.pokerCard = card1
self.__rightHand.pokerCard = card2
# 展示牌
def show_cards(self):
# 由于实现了__str__方法牌的对象可以被转换成字符串
print("左手:" + str(self.__leftHand.pokerCard))
print("右手:" + str(self.__rightHand.pokerCard))
# 交换牌
def swap_cards(self):
self.__leftHand, self.__rightHand = self.__rightHand, self.__leftHand
然后创建对象,完成程序的流程:
# 创建小明和两张牌,小明有两只手
xiaoming = Human()
card1, card2 = PokerCards("红桃", "A"), PokerCards("黑桃", "K")
# 小明拿牌
xiaoming.catch_cards(card1, card2)
# 小明展示牌,对比试验
xiaoming.show_cards()
# 小明交换牌
xiaoming.swap_cards()
# 小明展示牌
xiaoming.show_cards()
运行结果:
左手:红桃:A
右手:黑桃:K
左手:黑桃:K
右手:红桃:A
总结
面向过程编程,是程序员根据自己解决问题的步骤和思路,直接完成数据处理的操作。面向对象编程,则通过设计出各种类,并创建对应的对象,将不同的功能赋予不同的对象去完成,最终多个对象共同协作完