真的是随笔写的一篇,以防日后记忆模糊,特此记录。大佬勿喷

疑问:类属性和实例属性有何区别?

正题,代码如下

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__的实例属性有何区别?进来了解一下吧的更多相关文章

  1. 『无为则无心』Python面向对象 — 57、类属性和实例属性

    目录 1.类属性 (1)类属性的访问 (2)修改类属性 2.类属性和实例属性区别 1.类属性 (1)类属性的访问 类属性就是 类对象 所拥有的属性,它被 该类的所有实例对象 所共有. 类属性可以使用 ...

  2. Python类属性,实例属性

    1.Python类数据属性:定义在类里面但在函数外面的变量,它们都是静态的. #一段很简单的代码,但反应了很多 >>> class A(): a=1 #一个类里面有个属性a > ...

  3. Python中的类属性、实例属性与类方法、静态方法

    1.什么是类对象,实例对象 类对象:类名 实例对象:类创建的对象 2.类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,这个和C++.Java中类的静态成员变量有点 ...

  4. python基础-类的属性(类属性,实例属性,私有属性)

      一:类的属性 类的属性分为:类属性(公有属性),实例属性和私有属性. 1)类属性(公有属性(静态字段): 类定义时直接指定的属性(不是在__init__方法中),可以通过类名直接访问属性,并且保存 ...

  5. python 面向对象六 类属性和实例属性

    一.实例属性 Python是动态语言,根据类创建的实例可以任意绑定属性. >>> class Student(object): ... def __init__(self, name ...

  6. Python3 之 类属性与实例属性

    1.类属性与实例属性 类属性就相当与全局变量,实例对象共有的属性,实例对象的属性为实例对象自己私有. 类属性就是类对象(Tool)所拥有的属性,它被所有类对象的实例对象(实例方法)所共有,在内存中只存 ...

  7. python中的实例属性和类属性

    在python中,类属性和实例属性的区别是什么? 我认为是作用域的不同,实例对象可以访问类属性,类对象不可以访问实例属性.(类的概念本身就是作用域的概念,你不能让一只猫会飞,猫属于猫类,这一类都不会飞 ...

  8. Python笔记(十八)_私有属性、实例属性、类属性

    私有属性 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,就变成了一个私有属性,只有内部可以访问,外部不能直接访问或修改. 这样就确保了外部代码不能随意修改对象内部的状态,这样通过 ...

  9. Python基础:17类和实例之一(类属性和实例属性)

    1:类通常在一个模块的顶层进行定义.对于Python来说,声明与定义类是同时进行的. 2:类属性仅与其类相绑定,类数据属性仅当需要有更加“静态”数据类型时才变得有用,这种属性是静态变量.它们表示这些数 ...

随机推荐

  1. FridaHook框架学习(2)

    FridaHook框架学习(2) 前言 学习过程参考https://bbs.pediy.com/thread-227233.htm. 逆向分析 安装并运行例子程序,可以看到这个例子是一个验证注册码的程 ...

  2. 查看Linux用的桌面是GNOME、KDE或者其他(转)

    http://superuser.com/questions/96151/how-do-i-check-whether-i-am-using-kde-or-gnome 1) pgrep -l &quo ...

  3. 武装你的WEBAPI-OData资源更新Delta

    本文属于OData系列 目录 武装你的WEBAPI-OData入门 武装你的WEBAPI-OData便捷查询 武装你的WEBAPI-OData分页查询 武装你的WEBAPI-OData资源更新Delt ...

  4. 漫画 | CPU战争40年,真正的王者终于现身!

    上个世纪70年代,内存又慢又贵, 程序员得想尽一切办法节省内存. 那个时代的编译器也比较差劲 所以,70年代的程序员几乎都写得一手好汇编. 为了帮助程序员写好汇编,这个时候的CPU也有意把指令集做了增 ...

  5. 【noi 2.6_9275】&【bzoj 3398】Bullcow(DP){Usaco2009 Feb}

    题意:一共有N只牡牛(公牛)和牝牛(母牛),每2只牡牛间至少要有K只牝牛才不会斗殴.问无斗殴发生的方案数. 解法:f[i][j]表示一共i只牛,最后一只是j(0为牝牛,1为牡牛)的方案数.f[i][0 ...

  6. Codeforces Round #575 (Div. 3) D2. RGB Substring (hard version)

    传送门 题意: 给你一个长为n的仅由'R','G','B'构成的字符串s,你需要在其中找出来一个子串.使得这个子串在"RGBRGBRGBRGB........(以RGB为循环节,我们称这个串 ...

  7. log查看工具log2console

    log查看工具log2console介绍:https://www.cnblogs.com/TianFang/archive/2013/03/27/2985296.html Log2Console日志监 ...

  8. CF1475-C. Ball in Berland

    CF1475-C. Ball in Berland 题意: 一个班级有\(a\)个男生和\(b\)个女生,现在这个班级有\(k\)对男女愿意一起出席毕业典礼,这里注意\(k\)对男女中可能会有某个男生 ...

  9. CentOS 7 升级内核版本

    1.查看当前内核版本 $ uname -r 3.10.0-514.el7.x86_64 $ uname -a Linux k8s-master 3.10.0-514.el7.x86_64 #1 SMP ...

  10. OpenStack Train版-8.安装neutron网络服务(控制节点)

    安装neutron网络服务(controller控制节点192.168.0.10) 创建neutron数据库 mysql -uroot CREATE DATABASE neutron; GRANT A ...