Python零基础入门教程09 面向对象

前言

学无止境,无止境学。大家好,我是张大鹏,之前在抖音有5万多粉丝,不过现在不拍视频,专心写公众号了。笔者目前是高级Python工程师,之前是全栈工程师,主要擅长Golang和Python开发,对于JavaVue,React也有一些研究。工作之余,喜欢学习和分享,希望能够通过此公众号”张大鹏520″,将自己学到的东西分享给大家,和大家一起交流,一起成长,一起进步。

今天要给大家分享的是《Python零基础入门教程09 面向对象》,这是一个系列的教程,从零基础到项目实战。在本教程中,我会给大家介绍Python中面向对象的相关知识。比如类的定义,类的属性,魔法方法,封装性,继承性,多态性等。还会配套相关的练习,大家学完以后可以自行通过练习题巩固和加深对知识点的理解。

如果大家需要本教程的PDF电子书或者完整的源码,可以在文末找到获取方式哈。

01 面对对象基础

类的定义

面向对象的核心是类,类是对象的抽象,对象是类的实例。关于类,需要记住以下基本用法:

  • class 类名:声明一个类
  • c = 类名():使用类创建一个对象
  • c.方法名():调用类的方法

示例代码:

# `class 类名`:声明一个类
class Person:
    """声明一个类"""

    def eat(self):
        """声明类的方法,方法的第一个参数一般都是self"""
        print("人类都吃大米饭吗")


# `c = 类名()`:使用类创建一个对象
c = Person()
print(c, type(c))

# `c.方法名()`:调用类的方法
c.eat()

类的属性

一个类除了有很多方法,还会有很多属性。属性是一种抽象特征。比如人类,我们可以认为有姓名,年龄,性别等属性。如果你玩过游戏,游戏里面的角色有血条,蓝量,技能CD等,这些都属于属性。

对于属性,需要记住以下操作:

  • 属性名 = 属性值:定义属性
  • 对象名.属性名:获取属性值
  • 对象名.属性名 = 属性值:修改属性值

示例代码:

class Person:
    # `属性名 = 属性值`:定义属性
    name = "张大鹏"
    age = 22
    gender = "男"


# `对象名.属性名`:获取属性值
p = Person()
print(p.name, p.age, p.gender)

# `对象名.属性名 = 属性值`:修改属性值
p.name = "李思思"
p.gender = "女"
print(p.name, p.age, p.gender)

输出结果:

张大鹏 22 男
李思思 22 女

魔法方法

在Python中,类中使用__xxx__类似的带双下划线的方法被称作魔法方法。魔法方法会被Python在特定的时候自动执行,其中最常见的是__init__方法,用于在类实例化的时候自动调用,常用于初始化类的属性。

示例代码:

class Person:
    # `属性名 = 属性值`:定义属性
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender


# `对象名.属性名`:获取属性值
p = Person("张大鹏"22"男")
print(p.name, p.age, p.gender)

# `对象名.属性名 = 属性值`:修改属性值
p.name = "李思思"
p.gender = "女"
print(p.name, p.age, p.gender)

输出结果:

张大鹏 22 男
李思思 22 女

__str__方法

魔法方法__str__用于在调用类似print(对象)方法的时候,查看类的字符串表示时自动执行,要求返回一个字符串。

示例代码:

class A:
    def __str__(self):
        return "我是一个A类"


a = A()
print(a)

输出结果:

我是一个A类

__del__方法

魔法方法__del__用于在调用del 对象删除对象的时候自动执行,一般用于释放资源。

示例代码:

class A:
    def __del__(self):
        print("释放相关的资源")


a = A()
del a

输出结果:

释放相关的资源

02 面对对象高级

类的继承

面向对象有三大特性,封装,继承,多态。在Python中,类不仅可以单继承,还可以多继承。

单继承的语法如下:

class A(B):
    pass

多继承的语法如下:

class A(B,C):
    pass

示例代码:

class C:
    def show(self):
        print("ccccc")


class B:
    def show_b(self):
        print("bbbbbbbb")


# 单继承
class A1(B):
    pass


# 多继承
class A2(B, C):
    pass


if __name__ == '__main__':
    # 类继承以后自动拥有父类的属性和方法
    a1 = A1()
    a1.show_b()

    a2 = A2()
    a2.show()
    a2.show_b()

输出结果:

bbbbbbbb
ccccc
bbbbbbbb

方法重写

如果子类和父类方法同名了,默认调用子类的方法。此时如果又想要使用父类的方法,则可以对父类方法进行重写,在父类方法执行的前后添加逻辑,形成子类的方法。

示例代码:

class A:
    def show(self):
        print("AAAAAAAAAA")


class B(A):
    def show(self):
        """重写父类方法"""
        print("父类方法执行前。。。")

        # 调用父类的方法
        super().show()

        print("父类方法执行后。。。")


if __name__ == '__main__':
    b = B()
    b.show()

输出结果:

父类方法执行前。。。
AAAAAAAAAA
父类方法执行后。。。

封装性

面向对象除了继承性,还有封装性。封装性指的是对属性进行封装,然后公开方法进行访问。这样做的效果是,能够在调用者修改属性的前后进行校验,确保安全。Python中可以通过给属性添加双下划线self.__属性=值来实现属性的封装。

示例代码:

class Person:
    def __init__(self, name):
        # 私有属性
        self.__name = name

    # 提供公开方法
    def set_name(self, name):
        self.__name = name

    def get_name(self):
        return self.__name


if __name__ == '__main__':
    p = Person("张大鹏")
    print(p.get_name())

    p.set_name("李思思")
    print(p.get_name())

输出结果:

张大鹏
李思思

多态性

多态指的是同一个对象,在不同的时间,是不同的实现类对象。这个在Java这样的纯面向对象语言中比较舒服,不过Python这样的动态语言,变量本来就可以随便被修改,这个特性就显得没那么重要了。不过Python也能实现多态性。

示例代码:

class Dog:
    pass


class DogA(Dog):
    def show(self):
        print("Dog aaaaa")


class DogB(Dog):
    def show(self):
        print("Dog bbbbbb")


def show(d: Dog):
    d.show()


if __name__ == '__main__':
    # 这里参数是Dog父类,但是调用的时候,可以传任何子类
    # 体现了多态性
    show(DogA())
    show(DogB())

输出结果:

Dog aaaaa
Dog bbbbbb

类方法

类方法指的是可以通过类名调用的方法,对象也可以调用类方法。Python中用@classmethod修饰方法变为类方法,第一个参数是cls而不是selfcls表示类对象。这里只是一种建议命名,你也可以把cls改为其他符合命名规范的名字。

示例代码:

class A:
    @classmethod
    def show(cls):
        print("类方法。。。")


if __name__ == '__main__':
    # 通过类名调用
    A.show()

    # 通过对象调用
    a = A()
    a.show()

输出结果:

类方法。。。
类方法。。。

静态方法

静态方法也是可以通过类名和对象调用,使用@staticmethod修饰。没有默认的第一个参数。静态方法中无法访问类属性和对象属性。

示例代码:

class A:
    @staticmethod
    def show():
        print("静态方法")


if __name__ == '__main__':
    A.show()
    A().show()

输出结果:

静态方法
静态方法

结语

关注我不迷路,欢迎关注我的微信公众号”张大鹏520″,如果您对此文章感兴趣,欢迎点赞收藏,留言评论。

文中所有代码,只需要打赏20元,然后留言评论“已打赏”,即可获取哦。

本文的PDF电子书版,只需要打赏3元,然后留言评论“已打赏”,即可获取哦。

写文章不容易,不喜勿喷哈,如果有想要学编程,学项目,或者在工作中有项目难以单独完成需要提供帮助的同学,欢迎私信我哈。生活不易,想要利用学到的编程知识,业余赚点零花钱。

接项目:网站开发,APP开发,各种管理系统开发。

带徒弟:Python编程教学,Golang编程教学,前端编程教学。

谢谢您!!!


原文始发于微信公众号(张大鹏520):Python零基础入门教程09 面向对象

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/48532.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!