目录

面向对象的基本认知

(1)面向过程和面向对象

(2)面向对象的基本概念

对象

类的概念

类的定义

类的实例化

self关键字

(3)对象属性的添加与获取

(4)魔术方法

__init__()方法

__str__()方法

__del__()方法

扩展:__name__的使用场景

(5)基础练习


面向对象的基本认知

(1)面向过程和面向对象

Python的学习一般分为两个编程思想:

一个是面向过程,面向过程是将要实现的功能分为多个步骤(即函数)依次完成这些步骤然后整合到一起,完成目标

另一个是面向对象,面向对象是通过多个实体发出的动作(即属性)来实现需要的功能,使用时进行调用对应的实体

面向过程的核心思想 -- 自顶向下,逐步细化

面向对象的核心思想 -- 实现使用时先得到对应主体(封装的函数),再使用主体去实现功能

重点:二者的相同点和区别:

相同点:二者都可以实现代码的重用和模块化编程

区别:

面向对象的优势 -- 数据更封闭和安全模块化更深,思维更贴近日常生活,更有逻辑性在维护和扩展的角度,要比面向过程简单

面向过程的优势 -- 只关注前期开发的角度,比面向对象简单代码执行效率更高

(2)面向对象的基本概念

对象

对象(object)-- 现实任务中的一个动作实体对应着一个对象

对象使用属性(property)保存数据

对象使用方法(method)管理数据

类的概念

类(class)用于生产对象规定着对象的属性和方法先有类才有对象

类是具有相似或相同属性和动作的一组实体的集合,是对现实世界的模拟;一个对象的特征信息一般都是由所属的类所决定的,但每个对象又可以具有不同的特征信息

类的定义

Python中有两种类的定义方式(按自己喜欢的方式写,都可以使用)

Python2(经典类)

class 类名:

Python3(新式类)

class 类名(object):

注意类名遵循一般的标识符命名规则,一般为了与方法名区分,类名首字母大写

基本语法

class Person(object):
    #方法
    def eat(self):
        print("吃饭")
    def drink(self):
        print("喝水")
类的实例化

基本语法

对象名 = 类名()

实例化和调用对象

代码:

class Person(object):
    #方法
    def eat(self):
        print("吃饭")
    def drink(self):
        print("喝水")

f1 = Person()
f1.eat()
f1.drink()

f2 = Person()
f2.drink()

效果如下:

f1和f2就是实例化的对象,后面就是对方法的调用

self关键字

self指向类实例化的对象本身,即谁实例化了对象,self就是谁

代码:

class Person(object):
    def speak(self):
        print(self)
        print("hello world")

f1 = Person()
print(f1)
f1.speak()

f2 = Person()
print(f2)
f2.speak()

效果如下:

可以看到f1和f2的地址不同,实例化后打印self的值会随着实例化对象的改变而改变

(3)对象属性的添加与获取

对象一般由两部分组成:属性+方法

属性的添加

对象名.属性 = 属性值

前面我们可以知道self关键词指向实例化对象,那么可以在方法中直接用关键字指代对象从而添加属性

代码:

class Person(object):
    def speak(self):
        print(f'我的名字是{self.name},今年{self.age}岁了')

f1 = Person()
f1.name = '张三'
f1.age = '20'
f1.speak()

效果如下:

这里我们可以看到,要是想设置属性需要一个一个对应输入很繁琐,如何直接用实例化对象去设置属性呢,这就要用到魔术方法了

(4)魔术方法

魔术方法是具有特殊功能的函数

它们都有自己的触发条件

__init__()方法

__init__() -- 作为实例化对象时,会自动触发并调用,用于初始化方法或构造方法

代码:

class Person(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age

f1 = Person('李四', 55)

print(f"我的名字是{f1.name},今年{f1.age}岁了")

效果如下:

注意形参中要有对应的属性名

__str__()方法

定义了__str__()后,可直接用于返回输出的数据,用return的方式

代码:

class Person(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __str__(self):
        return f"我的名字是{self.name},今年{self.age}岁了"
f1 = Person('王五', 22)
print(f1)

效果如下:

注意return返回的是字符串类型的数据

__del__()方法

既然有构造对象的方法__init__,就会有删除对象的方法,就是__del__,当调用该方法时,会自动删除对象

代码:

class Person(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __del__(self):
        print(f"{self}对象已被删除")
f1 = Person('王五', 22)
print(f1)
del f1
print(f1)

效果如下:

从报错信息中可以看到f1对象已经被删除无法被找到

扩展:__name__的使用场景

当__name__被当成程序正常运行时,__name__属性被设置为字符串‘__main__’,作为主函数使用;

当__name__被当成模块导入时,__name__被设置为模块的名称被新的场景引用

当然还有很多魔法方法,感兴趣的可以自己上网搜索学习,这里只介绍多数情况下会使用到的几个魔术方法

(5)基础练习

接下来是对这节内容的一个综合练习,可以根据要求自己练习一下

要求:定义一个学生类,需要包含学生的姓名和成绩的属性,定义一个打印学生成绩的方法

(90分及以上显示优秀,80分及以上显示良好,70分及以上显示中等,60分及以上显示合格,60分以下显示不及格),成绩打印完后删除该对象

参考代码:

class Student():
    def __init__(self, name, score):
        self.name = name
        self.score = score

    def __str__(self):
        if not (0 <= self.score <= 100):
            return f"学生{self.name}的成绩无效"
        if self.score >= 90:
            return f"学生姓名:{self.name}, 成绩:{self.score}, 优秀"
        elif self.score >= 80:
            return f"学生姓名:{self.name}, 成绩:{self.score}, 良好"
        elif self.score >= 70:
            return f"学生姓名:{self.name}, 成绩:{self.score}, 中等"
        elif self.score >= 60:
            return f"学生姓名:{self.name}, 成绩:{self.score}, 及格"
        else:
            return f"学生的姓名是{self.name}, 成绩:{self.score}, 不及格"

    def __del__(self):
        print(f"\n学生{self.name}的对象已删除")

if __name__ == '__main__':
    f1 = Student("Tom", 85)
    f2 = Student("Alice", 99)
    f3 = Student("Jack", 65)
    f4 = Student("Bob", 52)
    f5 = Student("Lily", -2)
    print(f1)
    print(f2)
    print(f3)
    print(f4)
    print(f5)

效果如下:

Logo

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

更多推荐