一、面向对象编程定义

面向对象编程:把一组数据和处理数据的方法组成对象,把行为相同的对象归纳为,通过封装隐藏对象的内部细节,通过继承实现类的特化和泛化,通过多态实现基于对象类型的动态分派。

这句话可能不太好理解,等下面讲解之后,就会发现这句话总结的十分到位!!!

我们首先说类和对象这两个词。“物以类聚”这个词大家肯定听过。那么在面向对象编程中,对象是一个具体的概念,就像这个词中的“物”一样。一切皆为对象对象都有属性和行为每个对象都是独一无二的。属性(Attributes) 和 行为(Behaviors) 是描述对象的两个核心概念。属性指得是对象特有的状态或特征,行为是指描述对象的功能或操作。   而我们将对象的共同特征抽取出来就是一个类。也就是这个词中的“类”一个意思。

1、定义类

在Python 语言中,我们可以使用class关键字加上类名来定义类。在确定类的这块代码需要用函数这种抽象的方式将一类对象的共同特征进行动态提取。写在类里面的函数我们通常称之为方法,方法就是对象的行为,也就是对象可以接收的消息。方法的第一个参数通常都是self,它代表了接收这个消息的对象本身。

class Student:

    def study(self, course_name):
        print(f'学生正在学习{course_name}.')

    def play(self):
        print(f'学生正在玩游戏.')

上述代码我们构造了一个命名为“Student”的类。接下来我们将如何创建使用对象?

2、创建和使用对象

在我们定义好一个类之后,可以使用构造器语法来创建对象,代码如下所示。

stu1 = Student()
stu2 = Student()
print(stu1)    # <__main__.Student object at 0x10ad5ac50>
print(stu2)    # <__main__.Student object at 0x10ad5acd0> 
print(hex(id(stu1)), hex(id(stu2)))    # 0x10ad5ac50 0x10ad5acd0

所谓构造器就是定义一个变量=“类”(),正如代码中的stu1 = Student()一样。

这里要注意的是,如果用print函数打印stu1stu2两个变量时,我们会看到输出了对象在内存中的地址(十六进制形式),跟我们用id函数查看对象标识获得的值是相同的。

我们定义的变量其实保存的是一个对象在内存中的逻辑地址(位置),通过这个逻辑地址,我们就可以在内存中找到这个对象。

 接下来,我们尝试给对象发消息,也就是说我需要这个对象干什么事,我通过调用“类”让对象去执行。

# 通过“类.方法”调用方法
# 第一个参数是接收消息的对象
# 第二个参数是学习的课程名称
Student.study(stu1, 'Python程序设计')    # 学生正在学习Python程序设计.
# 通过“对象.方法”调用方法
# 点前面的对象就是接收消息的对象
# 只需要传入第二个参数课程名称
stu1.study('Python程序设计')             # 学生正在学习Python程序设计.

Student.play(stu2)                      # 学生正在玩游戏.
stu2.play()                             # 学生正在玩游戏. 

代码有两种调用形式!!!

3、初始化方法

刚才我们创建的学生对象只有行为没有属性,在这可能大家会迷糊什么是行为?什么是属性?我在上述已经讲过啦。其实用人话来说就是属性就行名字、年龄等特有的,行为是指对象可以执行的某些事情。

因此,如果要给学生对象定义属性,我们可以修改Student类,为其添加一个名为__init__的方法。在我们调用Student类的构造器创建对象时,首先会在内存中获得保存学生对象所需的内存空间,然后通过自动执行__init__方法,完成对内存的初始化操作,也就是把数据放到内存空间中。所以我们可以通过给Student类添加__init__方法的方式为学生对象指定属性,同时完成对属性赋初始值的操作,正因如此,__init__方法通常也被称为初始化方法。

class Student:
    """学生"""

    def __init__(self, name, age):
        """初始化方法"""
        self.name = name
        self.age = age

    def study(self, course_name):
        """学习"""
        print(f'{self.name}正在学习{course_name}.')

    def play(self):
        """玩耍"""
        print(f'{self.name}正在玩游戏.')

修改之后,在执行时

# 调用Student类的构造器创建对象并传入初始化参数
stu1 = Student('骆昊', 44)
stu2 = Student('王大锤', 25)
stu1.study('Python程序设计')    # 骆昊正在学习Python程序设计.
stu2.play()                    # 王大锤正在玩游戏.

我们会发现从之前的“学生正在****”变成了“某某正在***”。

二、时钟案例

要求:定义一个类描述数字时钟,提供走字和显示时间的功能。

import time

class Clock:

    def __init__(self, hour=0, minute = 0 , second = 0):

        self.hour = hour
        self.min= minute
        self.sec= second

    def runtime(self):
        self.sec += 1
        if self.sec == 60:
            self.sec = 0
            self.min += 1
            if self.min == 60:
                self.min = 0
                self.hour += 1
                if self.hour == 24 :
                    self.hour = 0

    def showtime(self):
        return f'{self.hour:0>2d}:{self.min:0>2d}:{self.sec:0>2d}'


clock = Clock(23 , 59 ,59)
while True:
    print(clock.showtime())
    time.sleep(1)
    clock.runtime()

在描述代码的时候,首先要清楚它的底层逻辑。我们要清楚两个点,①一个对象中有三个属性,分别指时针,分针,秒针。②秒针到了60的时,分针要+1;分针到了60的时候,时针要+1。所以在写代码的时候要清楚逻辑!oo

总结:我觉得,面向对象编程就是在玩模拟游戏,你设置好各种游戏机制、功能,然后指定让各种玩家去玩什么,界面会显示什么。

 

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐