Python面向对象编程02:深度认识类class

简介: 正式的Python专栏第37篇,同学站住,别错过这个从0开始的文章!

前篇学委展示分享了面向对象编程的概念,相信读者们对这个类和对象比较熟悉了。


我们在深入看一下类的结构。


类中的其他内置函数/属性

前文代码展示了‘__init__'函数,这个是类的内置函数,默认不写就没有执行多余操作。


在Python中类这种结构还包含了下面的一些内置函数属性:


__name__ 类名字

__dict__ 类的命名空间字典(这里先不做多解释,其实这个解释虽然抽象但是准确的,下面看代码就能秒懂)

__doc__ 类的文档说明

__module__ 类的文档说明

__bases__ 类的文档说明

看起来比较枯燥无味的样子,除了类的名字,我们看起来好像应该是类的名字(好像废话)


我们还是看一下代码感受一下:


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/11/15 11:58 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : __init__.py.py
# @Project : hello
"""
下面是一个学生类定义
"""
class student(object):
    """这里是一个学生类定义"""
    def __init__(self, name):
        self.name = name
    def get_name(self):
        return self.name
    def set_name(self, name):
        self.name = name
    def study(self):
        print(f"{self.name} : 好好学习,天天向上!")
stu01 = student("学委粉丝【小白】")
print(stu01)
print(stu01.get_name())
print(stu01.study())
print("类名:", student.__name__)
print("类文档:", student.__doc__)
print("类的命名空间:", student.__dict__)
print("类的基类:", student.__bases__)
print("类所在的模块:", student.__module__)

下面是运行效果:

image.png

好了,我们看到类的命名空间打印出来dict字典,内放置的内容的key都是类的成员(函数,属性)。


这下子清楚了:Python用一个dict来说描述类的结构!(这就是学委前篇提到的一张网,它把单一的函数,数据属性,挂到这个网上,组成了类的结构)。


其他几个内置类函数非常好理解。


另一个地方是’__bases__'函数,它告诉我们student类是在‘object’这个类的基础上创建的。(确实如此!)


内置函数获取其对象属性

python提供了下面的一些函数:


getattr(对象,属性名,[可选默认值]) : 获取对象的某个属性,如果没有找到返回默认值

setattr(对象,属性,属性值): 设置对象的,添加/覆盖某个属性为属性值。

hasattr(对象,属性): 判断对象是否包含某个属性

这个非常直白。


Java同学都知道反射,比较繁琐的。但是在Python中这块做的非常简洁,这个跟__dict__的设计很精巧.


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/11/15 11:58 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : student4_1.py
# @Project : hello
"""
下面是一个学生类定义
"""
class Student(object):
    """这里是一个学生类定义"""
    def __init__(self, name):
        self.name = name
    def get_name(self):
        return self.name
    def set_name(self, name):
        self.name = name
    def study(self):
        print(f"{self.name} : 好好学习,天天向上!")
stu01 = Student("学委粉丝【小白】")
print("student :", stu01)
print("student name:", stu01.get_name())
print("student study:", stu01.study())
stu02 = Student("学委粉丝【小花】")
print("student2 name:", stu02.get_name())
print("-" * 16)
print("getattr student name: ", getattr(stu01, 'name'))
# print("getattr: ", getattr(stu01, 'name2')) # AttributeError: 'Student' object has no attribute 'name2'
if hasattr(stu01, 'name2'):
    print("student %s has attribute name1 " % stu01.name)
else:
    print("student %s do not have attribute name2 " % stu01.name)
    print("getattr name2: ", getattr(stu01, 'name2', 'defaultName'))  # 没有但是我们可以给一个default
    # print(stu01.name1) # getattr并没有办法把属性设置到stu01对象
setattr(stu01, 'name2', '小白别名')
print("student name2", stu01.name2)
# 学委温馨提示,setattr很强大可以覆盖原来的对象属性
setattr(stu01, 'study', '小白躺平了,今天休息')
print("student study:", stu01.study)

上面的代码学委展示了获取修改属性。以及根据对象是否包含属性,进行setattr。

下面是运行结果:

image.png

读者多看一看,特别是代码附加的注释,加深对类和对象的理解。


既然说到了base类,再谈谈类的继承

上面的bases函数返回值的解释,换一句话说:


除了object类,其他所有类默认的都是直接或者间接的继承于object类的;

也就是说,object类是所有的类的根,源头类。


A类继承于B类,那么,我们会使用下面的描述来表示它们:


A类是B类的子类

B类是A类的父类


这个就跟家族族谱一样,最顶上那个第一代元祖父,这就是类和object的关系。


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/11/15 11:58 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : __init__.py.py
# @Project : hello
"""
下面是一个学生类定义
"""
class Programmer():
    pass
print("programmer类的命名空间:", Programmer.__dict__)
print("programmer类的命名空间:", Programmer.__bases__)
class Student(object):
    """这里是一个学生类定义"""
    def __init__(self, name):
        self.name = name
    def get_name(self):
        return self.name
    def set_name(self, name):
        self.name = name
    def study(self):
        print(f"{self.name} : 好好学习,天天向上!")
s1 = Student("学委粉丝【小白】")
print(s1)
print(s1.get_name())
print(s1.study())
print("类名:", Student.__name__)
print("类文档:", Student.__doc__)
print("类的命名空间:", Student.__dict__)
print("类的基类:", Student.__bases__)
print("类所在的模块:", Student.__module__)
class PrimarySchoolStudent(Student):
    pass
print("*" * 16)
print("PrimarySchoolStudent类的命名空间:", PrimarySchoolStudent.__dict__)
print("PrimarySchoolStudent类的基类:", PrimarySchoolStudent.__bases__)
print("PrimarySchoolStudent类所在的模块:", PrimarySchoolStudent.__module__)
PrimarySchoolStudent("主要学生").study()

这段代码想要展示的信息很多。


首先是在前面第一段代码后多加了一个Developer类(没有写继承)。


输出我们看到他说继承object类的(所以写跟不写没有差别,这里要注意python版本,学委用的是3.8)


其次,我们看到PirimarySchoolStudent的bases函数的输出是Student,没错,继承某个类之后的base值就为该类,也就是Student


再次,继承让子类直接拥有了父类的函数和数据属性,可以直接访问拿来用。


好了,请仔细看看下面的运行结果:


image.png

总结

这次把类和对象的知识补充了一些(但是还有Python支持多继承,这跟Java是很大的区别!),有过半不是常见的。

但是在写框架或者深度分析的时候,非常有用,务必过一过熟悉一下。

可以看看下图,回想一下上面的代码,这就是类命名空间,数据属性,函数属性,模块之间的关系:

image.png

我们可以通过命名空间找到函数属性,它们有关联。

此外,获取数据属性只能通过对象应用getattr来获取。

学委写了十几年的Java了,但是写的这套Python教程非常务实,对基础编程有任何问题请查看相关文章。

目录
相关文章
|
3月前
|
缓存 供应链 芯片
电子元件类商品 item_get - 商品详情接口深度分析及 Python 实现
电子元件商品接口需精准返回型号参数、规格属性、认证及库存等专业数据,支持供应链管理与采购决策。本文详解其接口特性、数据结构与Python实现方案。
|
8月前
|
人工智能 Python
[oeasy]python083_类_对象_成员方法_method_函数_function_isinstance
本文介绍了Python中类、对象、成员方法及函数的概念。通过超市商品分类的例子,形象地解释了“类型”的概念,如整型(int)和字符串(str)是两种不同的数据类型。整型对象支持数字求和,字符串对象支持拼接。使用`isinstance`函数可以判断对象是否属于特定类型,例如判断变量是否为整型。此外,还探讨了面向对象编程(OOP)与面向过程编程的区别,并简要介绍了`type`和`help`函数的用法。最后总结指出,不同类型的对象有不同的运算和方法,如字符串有`find`和`index`方法,而整型没有。更多内容可参考文末提供的蓝桥、GitHub和Gitee链接。
226 11
|
11月前
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
580 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
9月前
|
存储 C语言 Python
[oeasy]python077_int类型怎么用_整数运算_integer_进制转化_int类
本文主要讲解了Python中`int`类型的应用与特性。首先回顾了`int`词根的溯源,探讨了整型变量的概念及命名规则(如匈牙利命名法)。接着分析了整型变量在内存中的存储位置和地址,并通过`type()`和`id()`函数验证其类型和地址。还介绍了整型变量的运算功能,以及如何通过`int()`函数将字符串转化为整数,支持不同进制间的转换(如二进制转十进制)。此外,文章提及了关键字`del`的使用场景,对比了Python与C语言中`int`的区别,并总结了整型与字符串类型的差异,为后续深入学习奠定基础。
234 1
|
9月前
|
Python
Python 高级编程与实战:深入理解面向对象与并发编程
本文深入探讨Python的高级特性,涵盖面向对象编程(继承、多态、特殊方法、类与实例属性)、异常处理(try-except、finally)和并发编程(多线程、多进程、异步编程)。通过实战项目如聊天服务器和异步文件下载器,帮助读者掌握这些技术,编写更复杂高效的Python程序。
|
Python
Python面向对象(2)
【10月更文挑战第14天】
185 6
Python面向对象(2)
|
关系型数据库 开发者 Python
Python编程中的面向对象设计原则####
在本文中,我们将探讨Python编程中的面向对象设计原则。面向对象编程(OOP)是一种通过使用“对象”和“类”的概念来组织代码的方法。我们将介绍SOLID原则,包括单一职责原则、开放/封闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则有助于提高代码的可读性、可维护性和可扩展性。 ####
|
设计模式 程序员 C语言
Python面向对象
【10月更文挑战第13天】
147 2
Python面向对象
|
12月前
|
数据采集 存储 XML
python实战——使用代理IP批量获取手机类电商数据
本文介绍了如何使用代理IP批量获取华为荣耀Magic7 Pro手机在电商网站的商品数据,包括名称、价格、销量和用户评价等。通过Python实现自动化采集,并存储到本地文件中。使用青果网络的代理IP服务,可以提高数据采集的安全性和效率,确保数据的多样性和准确性。文中详细描述了准备工作、API鉴权、代理授权及获取接口的过程,并提供了代码示例,帮助读者快速上手。手机数据来源为京东(item.jd.com),代理IP资源来自青果网络(qg.net)。
|
Java C++ Python
Python基础---类
【10月更文挑战第10天】Python类的定义
213 2

推荐镜像

更多