什么是对象和类

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__ 三个类属性

类属性的调用方式

有两种

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

调用类属性的栗子

# 调用类属性的两种方式
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__ 会在实例化对象的时候自动调用,因此 blog1 创建成功就有 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

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

 

Python - 面向对象编程 - 类变量、实例变量/类属性、实例属性的更多相关文章

  1. python 面向对象编程学习

    1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...

  2. Python - 面向对象编程 - 什么是 Python 类、类对象、实例对象

    什么是对象和类 https://www.cnblogs.com/poloyy/p/15178423.html Python 类 类定义语法 最简单的类定义看起来像这样 class ClassName: ...

  3. python面向对象编程进阶

    python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...

  4. Python面向对象编程(上)

    Python不仅支持面向过程编程,同时也支持面向对象编程.面向工程就是分析解决问题所需的步骤,然后用函数把这些步骤逐一实现,使用的时候再一个个调用函数就可以.面向对象则是把解决的问题按照一定规则划分为 ...

  5. python - 面向对象编程(初级篇)

    写了这么多python 代码,也常用的类和对象,这里准备系统的对python的面向对象编程做以下介绍. 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计) ...

  6. Python 面向对象编程详解

    Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...

  7. 图解python | 面向对象编程

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/56 本文地址:http://www.showmeai.tech/article-det ...

  8. python面向对象编程(上)

    面向对象编程(OOP,Object Oriented Programming)是每一个高级编程语言都支持的编程方法,比如JAVA/C++/C#等等.学习面向对象编程是每一个程序员都绕不开的重点内容. ...

  9. python 面向对象编程(一)

    一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...

随机推荐

  1. Java 比较两个Word文档差异

    本文介绍使用Spire.Doc for Java的比较功能来比较两个相似Word文档的差异.需要使用的版本为3.8.8或者后续发布的新版本.可下载jar包,解压将lib文件夹下的Spire.doc.j ...

  2. 【排序+模拟】谁拿了最多奖学金 luogu-1051

    题目描述 某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同: 院士奖学金,每人$ 8000 $元,期末平均成绩高于\(80\)分(\(>80\)),并且在本 ...

  3. Vulnhub -- Jarbas靶机渗透

    目标:拿到服务器的Shell 信息收集 配置好后用nmap扫描 kali's ip:192.168.241.131 nmap -sP 192.168.241.131/24 一个个扫描 发现192.16 ...

  4. 什么是ETL--ETL定义、过程和工具选型思路

    ETL代表"提取.转换和加载".ETL 过程在数据集成策略中起着关键作用.ETL允许企业从多个来源收集数据并将其整合到一个集中的位置.ETL还使不同类型的数据可以协同工作. 概述 ...

  5. Orchestrator+Proxysql 实现自动导换+应用透明读写分离

    前面一篇博客我介绍了如何通过Orachestrator+脚本实现自动导换. 这一章,我来演示一下如何通过Orchestrator+Proxysql 实现自动导换+应用透明读写分离 总体架构 可选架构1 ...

  6. javascript获取焦点对象ID

    document.activeElement 方法:if(document.activeElement.id="textbox1") { }

  7. Typora PicGo Gitee博客写作好搭档

    利用Gitee仓库存放图片 1.首先在Gitee上创建一个公开的仓库,我这里创建了一个名叫resources的仓库: 2.在Gitee中获取私人令牌(个人设置界面中): 安装配置PicGo 1.下载自 ...

  8. 机器学习 - k-means聚类

    k-means简介 k-means是无监督学习下的一种聚类算法,简单说就是不需要数据标签,仅靠特征值就可以将数据分为指定的几类.k-means算法的核心就是通过计算每个数据点与k个质心(或重心)之间的 ...

  9. 单片机学习(一)项目的建立和vscode代码编辑环境的设置

    目录 Keil项目的建立 使用vscode进行开发 工欲善其事必先利其器,因此我们先搭建一个比较舒服的开发环境. Keil项目的建立 打开Keil软件点击Project/New uVision Pro ...

  10. 一张图带你搞懂Javascript原型链关系

    在某天,我听了一个老师的公开课,一张图搞懂了原型链. 老师花两天时间理解.整理的,他讲了两个小时我们当时就听懂了. 今天我把他整理出来,分享给大家.也让我自己巩固加深一下. 就是这张图: 为了更好的图 ...