类属性和__init__的实例属性有何区别?进来了解一下吧
真的是随笔写的一篇,以防日后记忆模糊,特此记录。大佬勿喷
疑问:类属性和实例属性有何区别?
正题,代码如下
age为People类的属性(称为类属性)
name是在__init__方法下,在创建实例对象的时候会自动调用,是动态创建的属性(称为实例属性)
class People:
age = 18 def __init__(self):
self.name = "小米" xm = People() print(People.age) # 类调用类属性
print(xm.age) # 实例对象调用类属性
print(xm.name) # 实例对象调用实例属性
代码似乎没什么问题,当然输出也没问题
18
小米
18
这个时候插入这样一段代码
print(People.name) # 类调用实例属性
奇怪的事情发生了,程序运行之后抛出以下异常
Traceback (most recent call last):
File "/Users/jinfukang/Desktop/metisPushRateMonitor/demo.py", line 14, in <module>
print(People.name) # 类调用实例属性
AttributeError: type object 'People' has no attribute 'name'
那么从异常信息看出说:People类没有name属性??
其实这是因为类在实例化之后只能通过实例对象去调用实例属性
继续,代码如下
class People:
age = 18 def __init__(self):
self.name = "小米" xm = People() People.age += 1 # 通过类调用类属性,使其属性值+1 print(xm.age) # 实例化对象调用类属性
print(People.age) # 类调用类属性
19
19
貌似没什么问题,继续,代码修改为如下
class People:
age = 18 def __init__(self):
self.name = "小米" xm = People() xm.age += 1 # 通过实例对象调用类属性,使其值+1
print(People.age) # 类调用类属性
print(xm.age) # 实例对象调用类属性 18
19
what???
使用类调用类属性+1,People.age和xm.age的值相等
使用实例对象调用类属性+1,People.age和xm.age的值竟然发生了变化。。。
按照咱们的期望,这2个值应该相等才对,可是为什么不一样了呢,接下来一起剖析一下
class People:
age = 18 def __init__(self):
self.name = "小米" xm = People() print("类调用类属性", id(People.age))
xm.age += 1 # 查看id,通过实例对象调用类属性,使其值+1
print("类调用类属性", id(People.age)) # 类调用类属性的,查看id
print("实例对象调用类属性", id(xm.age)) # 实例对象调用类属性,查看id 类调用类属性 4486466752
类调用类属性 4486466752
实例对象调用类属性 4486466784
由输出可以看出:
通过实例对象调用类属性+1前后,类调用类属性的身份证没有变化;实例对象调用的类属性身份证变了
这是不是可以说明 People.age和xm.age指向的不是同一个对象,为什么会这样呢,继续分析
这里就需要引入作用域的概念了: __init__的作用域只在自己的方法内,对于类属性它有访问的权限,但没有修改的权限
使用实例对象调用类属性使其值+1的时候,实例对象会在自己的作用域下创建一个age属性,将类属性的值拿过来并+1
对象调用age属性的时候,会先检查自己的作用域有没有age,如果有直接调用,所以类的age属性和对象的age属性的id发生变化
随笔记,有错误/遗漏的地方还请大佬指出,小弟感激不尽
类属性和__init__的实例属性有何区别?进来了解一下吧的更多相关文章
- 『无为则无心』Python面向对象 — 57、类属性和实例属性
目录 1.类属性 (1)类属性的访问 (2)修改类属性 2.类属性和实例属性区别 1.类属性 (1)类属性的访问 类属性就是 类对象 所拥有的属性,它被 该类的所有实例对象 所共有. 类属性可以使用 ...
- Python类属性,实例属性
1.Python类数据属性:定义在类里面但在函数外面的变量,它们都是静态的. #一段很简单的代码,但反应了很多 >>> class A(): a=1 #一个类里面有个属性a > ...
- Python中的类属性、实例属性与类方法、静态方法
1.什么是类对象,实例对象 类对象:类名 实例对象:类创建的对象 2.类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,这个和C++.Java中类的静态成员变量有点 ...
- python基础-类的属性(类属性,实例属性,私有属性)
一:类的属性 类的属性分为:类属性(公有属性),实例属性和私有属性. 1)类属性(公有属性(静态字段): 类定义时直接指定的属性(不是在__init__方法中),可以通过类名直接访问属性,并且保存 ...
- python 面向对象六 类属性和实例属性
一.实例属性 Python是动态语言,根据类创建的实例可以任意绑定属性. >>> class Student(object): ... def __init__(self, name ...
- Python3 之 类属性与实例属性
1.类属性与实例属性 类属性就相当与全局变量,实例对象共有的属性,实例对象的属性为实例对象自己私有. 类属性就是类对象(Tool)所拥有的属性,它被所有类对象的实例对象(实例方法)所共有,在内存中只存 ...
- python中的实例属性和类属性
在python中,类属性和实例属性的区别是什么? 我认为是作用域的不同,实例对象可以访问类属性,类对象不可以访问实例属性.(类的概念本身就是作用域的概念,你不能让一只猫会飞,猫属于猫类,这一类都不会飞 ...
- Python笔记(十八)_私有属性、实例属性、类属性
私有属性 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,就变成了一个私有属性,只有内部可以访问,外部不能直接访问或修改. 这样就确保了外部代码不能随意修改对象内部的状态,这样通过 ...
- Python基础:17类和实例之一(类属性和实例属性)
1:类通常在一个模块的顶层进行定义.对于Python来说,声明与定义类是同时进行的. 2:类属性仅与其类相绑定,类数据属性仅当需要有更加“静态”数据类型时才变得有用,这种属性是静态变量.它们表示这些数 ...
随机推荐
- HMS Core华为分析丨受众细分,多场景促进精益运营
用户的偏好不同,对产品的需求也不一样,要想更好地培养用户粘性,就需要因人施策,精细化运营,而受众细分是精细化运营的重要方法之一.受众细分是根据用户属性和行为数据,将具有相同或类似特征的用户归为一个群组 ...
- Spring Cloud Config、Apollo、Nacos配置中心选型及对比
Spring Cloud Config.Apollo.Nacos配置中心选型及对比 1.Nacos 1.1 Nacos主要提供以下四大功能 2.Spring Cloud Config 3.Apollo ...
- Cisco的互联网络操作系统IOS和安全设备管理器SDM__散知识点1
1.启动路由器:当你初次启动一台Cisco路由器时,它将运行开机自检(POST)过程.如果通过了,它将从闪存中查找Cisco IOS,如果有IOS文件存在,则执行装载操作(闪存是一个可电子擦写.可编程 ...
- DEDECMS:解决BMP、jpeg图片或MP4视频无法上传和在后台无法显示
一.BMP图片无法上传解决方法: 1.修改配置文件: 在include-->dialog的文件夹下, select_images_post.php--> 把 $sparr = Array( ...
- JavaScript里处理字符串的一些常用方法
1.length 属性返回字符串的长度 let srt = "hello world!"; console.log(srt.length) // 12 2.indexOf() 方法 ...
- A - A Gifts Fixing
t组询问,每次给出数列长度n 以及两个长度为n的数列{ai}和{bi}. 有三种操作:ai−1, bi−1以及ai,bi同时− 1 -1−1. 问最少多少步以后可以让两个数列变成常数数列. ...
- 动态规划TG.lv(1) (洛谷提高历练地)
动态规划TG.lv(1) P1005 矩阵取数游戏 分析:每行不超过80个数字,直接区间DP即可,\(dp[i][j]\)表示区间\([i,j]\)之间取数可以得到的答案,每次向右或者向左扩展即可.但 ...
- LA3902 Network (树上dfs)
题目链接:点击打开链接 题意:n台机器连成一个树状网络,其中叶节点是客户端,其他节点是服务器,目前有一台服务器s正在提供服务.让你在其他服务器上也安排同样的服务,使得每台客户端到最近服务器的距离不超过 ...
- 【bzoj 1202】[HNOI2005] 狡猾的商人(图论--带权并查集+前缀和)
题意:一个账本记录了N个月以来的收入情况,现在有一个侦探员不同时间偷看到M段时间内的总收入,问这个账本是否为假账. 解法:带权并查集+前缀和. 判断账本真假是通过之前可算到的答案与当前读入的值是否 ...
- python+fiddler 抓取抖音数据包并下载抖音视频
这个我们要下载视频,那么肯定首先去找抖音视频的url地址,那么这个地址肯定在json格式的数据包中,所以我们就去专门查看json格式数据包 这个怎么找我就不用了,直接看结果吧 你找json包,可以选大 ...