Python - 面向对象编程 - 类变量、实例变量/类属性、实例属性

简介: Python - 面向对象编程 - 类变量、实例变量/类属性、实例属性

什么是对象和类


https://www.cnblogs.com/poloyy/p/15178423.html

 

什么是 Python 类、类对象、实例对象


https://www.cnblogs.com/poloyy/p/15178456.html

 

类变量、实例变量/类属性、实例属性


前言

只是叫法不一样

实例属性 = 实例变量

类属性 = 类变量

个人认为叫属性更恰当

 

类属性和实例属性区别

  • 类属性,所有实例对象共享该属性
  • 实例属性,属于某一个实例对象的属性,用于描述具体的对象

 

从实际栗子了解类属性、实例属性


有一个表格,四个常见的明星

姓名 年龄
周润发 58
成龙 55
刘德华 53
周星驰 54

总结一下

  • 四个人归类为明星
  • 每个明星都有两个属性:姓名、年龄
  • 明星这个群体具有一个属性:明星数量,在这张表是 4
  • 姓名和年龄等属性是用来描述具体的一个对象
  • 明星的数量是用于描述明星这个类别

 

使用面向对象编程思想来总结的话

  • 周润发、成龙、刘德华、周星驰都是实例对象
  • 他们都属于明星,明星是
  • 属于实例对象的属性有:姓名、年龄,所以也叫实例属性
  • 属于明星类的属性有:数量,所以也叫类属性

 

类里面的三种类型变量


  • 在所有方法之外定义的变量,称为类属性/类变量
  • 在方法内部,通过 self.变量名 方式定义的变量,称为实例属性/实例变量
  • 在方法内部,通过 变量名=变量值 方式定义的变量,称为局部变量

 

类属性


类属性在类中的定义

class 类名:
    类属性1 = 值
    类属性2 = 值
    def func(self): 
        ...        


类属性、类方法注意点

  • 无论是类属性还是类方法,都无法像普通变量或者函数那样,在类的外部直接使用它们(类方法后面详解)
  • 可以将类看做一个独立的空间,类属性其实也是在类体中定义的变量,类方法是在类体中定义的函数
  • 需要通过类对象/实例对象来调用类属性 ClassName.classProperty (类方法后面详解)

 

类属性的栗子

# 类属性
class PoloBlog:
    # 这就是在所有方法之外 下面定义了 2 个类变量
    name = "小菠萝测试笔记"
    blog = "https://www.cnblogs.com/poloyy/"
# 通过类名调用类属性
print(PoloBlog.name)
print(PoloBlog.blog)
# 输出结果
小菠萝测试笔记
https://www.cnblogs.com/poloyy/


通过 Pycharm 的代码联想,可以看到 blog、name、__doc__ 三个类属性

image.png

类属性的调用方式

有两种

  • 直接通过类名调用
  • 也可以通过类的实例对象调用

 

调用类属性的栗子

# 调用类属性的两种方式
class PoloBlog:
    # 这就是在所有方法之外 下面定义了 2 个类变量
    name = "小菠萝测试笔记"
    blog = "https://www.cnblogs.com/poloyy/"
# 通过类名直接调用
print(PoloBlog.name)
print(PoloBlog.blog)
# 修改类属性
PoloBlog.name = "blogyuan"
PoloBlog.blog = "https://www.cnblogs.com/"
# 通过实例对象调用修改后的类属性
poloBlog = PoloBlog()
print(poloBlog.name)
print(poloBlog.blog)
# 输出结果
小菠萝测试笔记
https://www.cnblogs.com/poloyy/
blogyuan
https://www.cnblogs.com/


通过类名修改类属性的值,会影响所有的实例化对象

 

实例对象修改类属性

# 修改类属性
poloBlog.name = "小菠萝回来了"
# 再看看类对象调用修改后的类属性
print(PoloBlog.name)
print(poloBlog.name)
# 输出结果
blogyuan
小菠萝回来了


  • 会发现,类名.name 仍然返回之前的值,而 实例对象.name 会返回修改的值
  • 原因: 实例对象.name 本质上并不是修改类属性的值,而是在定义一个新的实例属性(下面详解)

 

动态添加类属性

PoloBlog.age = 24
print(PoloBlog.age)
print(poloBlog.age)
# 输出结果
24
24


  • age 没有在类体中定义
  • 可以直接通过 类名.new_property_name 的方式定义一个新的类属性

 

实例属性


  • 属于具体对象的属性,用于描述具体的对象
  • 只能通过实例对象访问,无法通过类名访问

 

实例属性的栗子

class PoloBlog:
    def __init__(self):
        # 在方法内部,通过 self.name 的方式定义的变量就是实例变量
        self.name = "小菠萝测试笔记"
        self.add = "https://www.cnblogs.com/poloyy/"
    # 下面定义了一个 say 实例方法
    def say(self):
        self.age = 13
# 实例化对象
blog = PoloBlog()
blog.say()
print(blog.name, blog.add, blog.age)
# 输出结果
小菠萝测试笔记 https://www.cnblogs.com/poloyy/ 13


  • 重点:__init__ 会在实例化对象的时候自动调用,因此 blog 创建成功就有 name、add 两个实例属性
  • 调用 say() 方法之后才有第三个实例属性 age

 

修改实例属性的栗子

blog.name = "小菠萝"
blog.add = "xiaopolo.com"
blog.age = 24
print(blog.name, blog.add, blog.age)
# 输出结果
小菠萝 xiaopolo.com 24



动态添加实例属性

blog.phone = 13501489999
print(blog.phone)
# 输出结果
13501489999


上面也有说到,通过 实例对象.属性名 的方式并不会给类变量赋值,而是定义一个新的实例变量

 

综合栗子

# 综合栗子
class PoloBlogObjectTest:
    # 类变量
    sum = 0
    # 初始化方法
    def __init__(self, name, age):
        # 实例变量
        self.name = name
        self.age = age
        # 类变量
        PoloBlogObjectTest.sum += 1
    # 实例方法
    def printNameAge(self):
        print(self.name, self.age)
poloTest1 = PoloBlogObjectTest("小菠萝一号", 24)
poloTest2 = PoloBlogObjectTest("小菠萝二号", 14)
print(PoloBlogObjectTest.sum)
# 调用实例方法
poloTest1.printNameAge()
poloTest2.printNameAge()
# 输出结果
2
小菠萝一号 24
小菠萝二号 14


不推荐实例属性和类属性同名


  • 类中,实例属性和类属性可以同名
  • 但这种情况下使用实例对象将无法调用类变量,它会首选实例变量,无论这个变量是否已定义
  • 实例独享绑定新的实例属性时,会直接覆盖掉重名的类属性

 

实例属性、类属性同名栗子

class Person:
    # 只有一个类变量
    name = "cool guy"
# 实例化一个对象
p = Person()
# 打印实例属性 name,因为实例对象并没有name属性,所以会继续查找class的name属性
print(p.name)
# 打印类属性 name
print(Person.name)
# 给实例绑定 name、age 属性
p.name = "bad guy"
p.age = 12
# 打印 name、age 属性
print(p.age)
# 由于实例属性优先级比类属性高,因此,它会屏蔽掉类的 name 属性
print(p.name)
# 仍然打印类的 name 属性
print(Person.name)
# 输出结果
cool guy
cool guy
12
bad guy
cool guy


实例对象属性引用的查找过程


image.png

相关文章
|
2月前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
265 0
|
8月前
|
索引 Python
Python的变量和简单类型
本文介绍了Python中变量命名规则、常用变量类型及字符串操作。变量命名需遵循字母、数字和下划线组合,不能以数字开头且不可与关键字冲突。字符串支持单引号、双引号或三引号定义,涵盖基本输出、转义字符、索引、拼接等操作。此外,还详细解析了字符串方法如`islower()`、`upper()`、`count()`等,帮助理解字符串处理技巧。
220 15
|
8月前
|
人工智能 Python
[oeasy]python082_变量部分总结_variable_summary
本文介绍了变量的定义、声明、赋值及删除操作,以及Python中的命名规则和常见数据类型。通过示例讲解了字符串与整型的基本用法、类型转换方法和加法运算的区别。此外,还涉及异常处理(try-except)、模块导入(如math和random)及随机数生成等内容。最后总结了实验要点,包括捕获异常、进制转化、变量类型及其相互转换,并简述了编程中AI辅助的应用策略,强调明确目标、分步实施和逐步巩固的重要性。更多资源可在蓝桥、GitHub和Gitee获取。
280 97
|
4月前
|
Python
解决Python中AttributeError:'image'对象缺少属性'read_file'的问题策略。
通过上述策略综合考虑,您将能够定位问题并确定如何解决它。记住,Python社区很庞大,也很乐于帮助解决问题,因此不要害怕在求助时提供尽可能多的上下文和您已经尝试过的解决方案。
139 0
|
7月前
|
算法 Python
Apriori算法的Python实例演示
经过运行,你会看到一些集合出现,每个集合的支持度也会给出。这些集合就是你想要的,经常一起被购买的商品组合。不要忘记,`min_support`参数将决定频繁项集的数量和大小,你可以根据自己的需要进行更改。
283 18
|
8月前
|
Python
解决Python报错:DataFrame对象没有concat属性的多种方法(解决方案汇总)
总的来说,解决“DataFrame对象没有concat属性”的错误的关键是理解concat函数应该如何正确使用,以及Pandas库提供了哪些其他的数据连接方法。希望这些方法能帮助你解决问题。记住,编程就像是解谜游戏,每一个错误都是一个谜题,解决它们需要耐心和细心。
380 15
|
8月前
|
存储 程序员 Python
Python 变量和简单数据类型
本文介绍了 Python 编程的基础知识,从创建第一个 Python 文件 `hello_world.py` 开始,讲解了 Python 文件的运行机制及解释器的作用。接着深入探讨了变量的定义、命名规则和使用方法,并通过示例说明如何修改变量值。同时,文章详细解析了字符串的操作,包括大小写转换、变量插入及空白字符处理等技巧。此外,还涵盖了数字运算(整数与浮点数)、常量定义以及注释的使用。最后引用了《Python 之禅》,强调代码设计的美学原则和哲学思想。适合初学者快速掌握 Python 基础语法和编程理念。
164 5
|
9月前
|
Python
[oeasy]python073_下划线在python里是什么含义_内部变量_私有变量_系统变量
本文回顾了Python中从模块导入变量和函数的方式,重点讨论了避免本地变量名冲突(local name clashes)的方法。通过`from module import variable as alias`可以为导入的变量重命名,防止冲突。根据PEP8规范,建议避免使用`from module import *`,因为它会导入模块中所有非下划线开头的变量,容易引发冲突。下划线在变量命名中有特殊含义:单个前导下划线表示内部变量,后置下划线用于避免与关键字冲突,双下划线前后包围表示系统变量。总结了下划线的不同用法及其作用。下次将继续探讨更实用的编程技巧。
196 3
|
Java 程序员 Python
python学习13-面向对象的三大特征、特殊方法和特殊属性、类的浅拷贝和深拷贝
python学习13-面向对象的三大特征、特殊方法和特殊属性、类的浅拷贝和深拷贝
|
Python
【Python零基础入门篇 · 24】:面向对象的多态、静态方法和类方法
【Python零基础入门篇 · 24】:面向对象的多态、静态方法和类方法
180 0
【Python零基础入门篇 · 24】:面向对象的多态、静态方法和类方法

推荐镜像

更多