Python之面向对象:实例属性、类属性,傻傻分不清楚

liftword3周前 (12-08)技术文章13

引言

在上一篇文章中,我们初步介绍了Python面向对象中类定义的语法,顺带介绍了关于面向对象的系统工程中,所涉及的OOA与OOD。

其实,简单来说,类的定义其实就是面向对象的“封装”特性的体现。我们将分析、设计得到的实体的属性和方法,通过类的定义封装在一起,从而实现了代码模块的“高内聚”的特性。

相较于方法,属性的定义似乎要简单一些。但是,即便是简单的属性,稍不留意,可能也会触发意料之外的错误。所以,今天这篇文章,我们来稍微理一下类定义中属性的使用。

类属性与实例属性

一个简单的区分,看是在类中直接定义,还是在类的__init__方法中定义。

在Python类的定义中,直接在类中定义的变量,被称为类属性。因为Python中一切皆对象,类本身也是一个对象,类属性,其实就是类对象的属性。

在__init__方法中进行定义、初始化的属性,为对象属性。对象的属性是属于每个实例化的对象的,每个对象的实例属性都是各自独立存储的。

还以打工人的类定义进行举例说明:

class DaGongRen:
    # 类属性,打工人计数
    num = 0

    def __init__(self, no, name):
        # 实例属性
        self.no = no
        self.name = name
        DaGongRen.num += 1

    def work(self):
        print(f"工号{self.no}的打工人【{self.name}】在努力工作")

属性的访问

关于属性的访问,先说几条简单的规则:

1、对象属性的访问,可以直接通过对象名.属性名的方式进行访问。

2、类属性的访问,可以通过对象名.属性名的方式,也可以通过类名.属性名的方式访问。

3、如果出现同名属性,访问时会按照属性查找的既定顺序进行同名覆盖。关于既定顺序,暂时可以理解为就近原则,在后面的方法查找路径中会进行进一步讲解。实例属性是可以通过继承存储到子类的对象实例中的,类属性是按照查找路径可以访问的。

4、Python中允许在对象的使用过程中动态添加新的属性,这个对象既包括实例对象也包括类对象,也就是说,类属性和实例属性都是可以动态添加的,虽然不建议这样做。

5、属性的修改会使规则变得复杂一些,简化来说,虽然实例对象能够访问到类对象中的类属性,但是,仅限于读操作。实例对象不能修改类对象中的类属性,当尝试进行这样操作时,会发现出发了第4条规则,实际的执行结果是在实例对象中添加了一个与类属性同名的实例属性。

以实际的代码为例:

# 通过类名访问类属性
print(DaGongRen.num)
zs = DaGongRen(11, 'zhangsan')
# 通过类名访问类属性
print(DaGongRen.num)
# 通过对象名访问类属性
print(zs.num)
# 看似修改类属性,实际是在对象中动态添加同名的属性,在对象实例中存储
zs.num = 100
# 访问的是对象的实例属性
print(zs.num)
# 访问的是类的类属性
print(DaGongRen.num)

# 动态添加类属性
DaGongRen.abc = 123
print(DaGongRen.abc)
# 对象名访问新增的类属性
print(zs.abc)

执行结果:

相关文章

一文讲懂Python变量

大家好,我是宁一。后面我们不管是做网站,还是做数据分析,都要处理各种各样的数据,比如姓名、生日、分数等。变量,就是我们给这些数据起的名字。1、定义变量比如我们用变量定义一个学生的姓名和成绩,可以这样来...

Python中的“类变量”和“成员变量”的区别——易混淆

在Python的面向对象编程中,类变量和成员变量(也被称为实例变量)是两种不同类型的数据。1、类变量(Class Variable):类变量是定义在类中,但在任何方法之外的变量。类变量在该类的所有实例...

Python | 变量如何定义,数据类型介绍

本章主要内容:①变量的定义②基本数据类型介绍一、变量的定义1.变量变量来源于数学,是计算机语言中能储存计算结果或能表示值的一个抽象概念(可以理解为-个代号)。● 容器:存放数据● 变量可以通过变量名访...

一文学会Python的变量命名规则!

目录1.变量的命名原则3.内置函数尽量不要做变量4.删除变量和垃圾回收机制5.结语1.变量的命名原则①由英文字母、_(下划线)、或中文开头②变量名称只能由英文字母、数字、下画线或中文字所组成。③英文字...

python常用的内置模块有哪些?这20个模块算是高频使用的吗?(上)

1.os1.1 作用主要是和操作系统相关的一个模块,如可以进行文件/目录的创建、删除等1.2 导入import os1.3 常用方法及说明常用方法说明os.getcwd()获取当前路径os.chdir...