当前位置: 首页 > article >正文

Python语法基础(五)

🌈个人主页:羽晨同学

💫个人格言:“成为自己未来的主人~”  

首先,我们需要明白一句话,在Python中,一切都是对象

单片机,嵌入式都是面向过程的

面向对象有封装,继承,多态的特性

而面向过程需要做底层开发,面向对象是有好多东西已经封装好了,直接用就可以了

比如说:

狗吃屎,这个是面向对象的,强调吃的对象。

吃狗屎,这个是面向过程的,强调吃的过程

类和对象

我们这篇文章主要说的是任何一门语言都必不可少的,极其重要的部分---类和对象

类是一个具有特殊功能的实体的集合,抽象的一个概念。

对象是一个具体的存在。

看上面的是不是感觉有点空,接下来,让我们在代码中感受一下。

首先,我们来定义一个空类。

# 1.空类
class MyClass1():
    pass #对类的特征的描述,对类的行为的描述
class MyClass2():
    pass

这个类中pass的位置,我们应该放的是对类的特征的描述,对类的行为的描述。

所以接下来,让我们创建一个非空类

# 2.非空类
def check():
    print('check----start')
    print('check----end')

而在非空类中,我们要进行的是对类的特征的描述或者对类的行为的描述。

对类的特征的描述,代表的是变量。

对类的行为的描述,代表的是函数。

我们来看下面的这个代码。

class MyClass3():
    print('33333----start')
    # 类体
    # 0.对类的特征的描述:变量
    num=10
    name="zhangsan"

    # 1.对类的行为的描述:函数
    def show(self):
        print("showing")
    def func1(self):
        print('111111')
    print('33333---end')

需要注意的是,和函数相同的是,类中也会引入新的作用域,所以在类中定义的变量或者函数,在类外是不能直接访问的。

print(num)
print(func1)

比如说如果运行这个代码,是会报错的。报错内容如下:

NameError: name 'num' is not defined. Did you mean: 'sum'?

 另外,我们也可以采用下面的这种方式来定义类

class MyClass3:
    print('33333----start')
    # 类体
    # 0.对类的特征的描述:变量
    num=10
    name="zhangsan"

    # 1.对类的行为的描述:函数
    def show(self):
        print("showing")
    def func1(self):
        print('111111')
    print('33333---end')

上面是类的部分,接下来,我们说一下对象。

对象也被称为实例,创建对象也叫做实例化对象或者类的实例化。

语法:变量=类名()

比如说,我们来看下面的这个代码

class Person():
    pass
p1 = Person()
print(p1) # <__main__.Person object at 0x000001E6FE0B7490>
print(id(p1))
p2 = Person()
print(p2) # <__main__.Person object at 0x000001E6FE0B74D0>
print(id(p2))

在这个当中,我们就创建了两个对象。

但是在这个类中,是没有定义构造函数的。

那么,如果定义了构造函数,会是什么样子的呢?

常见的构造函数:

__init__

当有构造函数后,当我们常见对象的时候,会自动调用构造函数。 

class Animal():
    # 构造函数之一:__init__,表示初始化,给对象初始化
    # 注意:形如__xx__命名的函数,这种函数不需要手动调用,会在特殊的场景下自动调用
    # __init__:当创建对象的时候,会自动调用__init__函数
    # self:无需传参。会被自动传参,当创建对象的时候会被当前创建的对象自动传参给self,self:
    # self: 表示当前对象
    def __init__(self,name,age,kind): # self是a1和a2的地址
        # print('init--------',id(self),name,age,kind)
        # 语法:对象.变量=值,表示给当前对象进行特征的描述
        self.name = name
        self.age=age
        self.kind=kind

构造函数中的self, 代表不需要我们传参,它会自动传参,当创建对象的时候会被创建的对象自动传参给self

也就是说,self表示的是当前的对象。

a1=Animal('小白',3,'猫') # a b c 来描述对象的特征
print('a1:',id(a1))
print(a1.name,a1.kind,a1.age)
a2=Animal(4,5,6)
print('a2:',id(a2))

如果不使用构造函数呢?

比如说下面的这个代码

class Animal():
    pass
# 注意:创建对象的时候,需不需要传参,一定要和__init__函数匹配
a1=Animal()
a1.name='小白'
a1.age=3
a1.kind='猫'
print(a1.name,a1.age,a1.kind)

a2=Animal()
a2.name='bob'
a2.age=5
a2.kind='田园犬'

你看,这样相比较之下,下面的这个是不是很不方便。

类中的属性

类中的成员有变量和属性。变量我们上面说了,我们下面来说一下属性。

类中的属性一般分为两种,一种是类属性,一种是实例属性

其中的类属性直接定义在类中。

实例属性是通过对象.属性=值的方式来定义。

我们来看下面的这一段代码

class Person():
    # 类属性直接定义在类中,
    place = '地球'
    # 实例属性体现形式一、只要通过 对象.属性=值 语法定义的属性
    def __init__(self,name,age):
        self.name=name
        self.age=age

p1=Person('小明',10)
p1.hobby='跳舞'

其次,访问方式不同

类属性可以通过类名或者对象来访问

实例属性只能通过对象访问 

print(Person.place)
print(p1.place)
# 实例属性只能通过对象访问
print(p1.age)
print('*' * 50)

第三,访问优先级不同

当类属性和实例属性重名的时候,通过对象访问,优先访问的是实例属性

第四,使用场景不同

类属性是多个实例对象共有的属性,而实例属性是实例对象特有的属性。

p2=Person('xiaoming',10)
p3=Person('xiaoli',5)
print(p2.place,p3.place)

Person.place='火星'
print(p2.place,p3.place)

好了,我们这篇文章的内容就到这里,我们下次再见。


http://www.kler.cn/a/417649.html

相关文章:

  • Linux 设备驱动分类(快速理解驱动架构)
  • 使用线性回归模型逼近目标模型 | PyTorch 深度学习实战
  • DeepSeek大模型介绍、本地化部署与使用!【AI大模型】
  • HTML排版标签、语义化标签、块级和行内元素详解
  • SGlang 专为大模型设计的高效服务框架
  • Leetcode面试高频题分类刷题总结
  • 创建模态对话框窗口
  • SpringBoot 框架下的新冠密接者跟踪系统:卓越性能与稳定性保障
  • 【Python网络爬虫笔记】6- 网络爬虫中的Requests库
  • tomcat控制台中文乱码的解决方法
  • 使用LabVIEW2019x64的IMAQdx调用工业相机采图(二)
  • DataWhale—PumpkinBook(TASK07支持向量机)
  • 记录Threadlocal使用
  • 机载视频流回传+编解码方案
  • node.js基础学习-http模块-创建HTTP服务器、客户端(一)
  • jeecgbootvue2重新整理数组数据或者添加合并数组并遍历背景图片或者背景颜色
  • 三维路径规划|基于黑翅鸢BKA优化算法的三维路径规划Matlab程序
  • AI前景分析展望——GPTo1 SoraAI
  • 浮点数计算,不丢失精度
  • 第二部分shell----二、shell 条件测试
  • Flutter 1.2:flutter配置gradle环境
  • Docker初识-架构
  • 【C++boost::asio网络编程】有关socket的创建和连接的笔记
  • 半导体制造检测新突破:XARION 激光超声无损检测系统的应用
  • element的el-table表格标题用css自定义是否必填,用添加伪类的方式标红色*
  • Ubuntu 安装 MariaDB