《C++中的this和Python的self对比》基本都是针对函数而言的,从变量的角度看,也有相同之处。

C++中,类中定义的变量一般叫做成员变量,或者说是成员属性,它只属于实例对象,只有实例对象才能用。加上了static关键字才是给类用的 称之为静态变量。

而python不同,实例对象调用属性时,首先是看自身是否已经构建了该属性,如果有就用,如果没有还会去类属性里找, 如果类里有,会直接自动创建一个和类名相同的变量(不会报错,而是自动创建一个同名而没有关系的变量)。初始值和该类属性相同。

#实验例子:

class Stack:
y = 1
def test(x):
     print("y",x.y)
x.y = 10 s = Stack()
s.test() ##看看该句,屏蔽和不屏蔽有何不同
print('s.y = ',s.y)
#print('Stack.y = ',Stack.y)
#print('Stack().y = ',Stack().y)

print(type(Stack))

print(type(Stack()))

print(type(s))

print(id(Stack))

print(id(Stack()))

print(id(s))

如果s.test()被屏蔽程序就会报错。根据《C++中的this和Python的self对比》中讲到

如果是已实例调用方法,会自动传入实例的“指针”self,

那么调用s.test()  其实就是 执行了 self.y = 10, 这就构建了一个实例变量y。

如果不调用s.test() ,就相当于没有构建实例变量y。那边实例就会去类中找y并将值和类中的y此时的值一致。

//----------------------------分割线-----------

还有一个问题就是,类属性和实例属性的构建时间。

对于python而言,类属性在类定义之后也构键好了,但是在成员定义之后成员属性并没有构建!这是为什么呢?

原因:

  因为python不用声明变量,或者说它的声明、定义、和初始化是一步到位的。而实例属性的定义,只能是显性的通过实例对象来定义(如self.name),

换句话说实例属性的定义只能在类方法中进行。所以如果该函数没有被调用,那么方法中的该实例属性就不会被构建!

所以,如果想在构建实例的时候,就想把实例的属性都构造好,那么就必须把实例的属性的定义放在__init__方法中, 这样,在构建实例的时候,会自动调用__init__方法,这样就能确保实例属性被造。

  对于C++而言,类属性在类定义之后就构成好了这和python一样,而成员属性,在成员定义之后成员属性也会构建好(构建的意思就是分配内存空间)

  至于,方法内定义的变量都是属于函数的局部变量,也是只有调用函数的时候才会分配空间。还有C++的类定义就只能是定义,成员变量此时是不能初始化的,初始化只能放在构造函数里等待实例被构造的时候初始化。如果不初始化成员变量的值,就会是定义时分配的内存中的值。

  还有,C++的类属性,也就是静态属性,他的初始化应该是在定义全局变量的位置,初始化的方法为:int A::s = 0; (A是类名,s是静态属性,     要注意是,此时初始化的过程还必须带上变量类型!访问静态方法也好,访问静态属性也好,都是类名加双冒号实现!)

//----------------------------分割线-----------

总结:不管是C++还是python都大致分为3种变量/属性:(叫法我随便说的,不要在意)

1、类属性(C++中叫静态变量,python中叫类属性)

2、实例属性(C++中叫成员变量,python中叫成员属性)

3、局部变量(C++中叫局部变量,python中叫局部变量)

python编译如何区分这三种变量/属性?

答:

1、声明在类中,且在方法的外部的属性就是类属性。

2、声明在方法内部,且有实例前缀的属性就是实例属性

3、声明在方法内部,且没有实例前缀的属性就是局部变量

C++编译如何区分这三种变量/属性?

答:

1、声明在类中,且在方法的外部的带static关键字的属性是类属性。

2、声明在类中,且在方法的外部的不带static关键字的属性是实例属性。

3、声明在方法内部,就是局部变量

C++和python的变量对比的更多相关文章

  1. Go/Python/Erlang编程语言对比分析及示例

    本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性,不过最主要的原因是这几个我比较熟悉. Go的很多语言特性借鉴 ...

  2. Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!

    Go/Python/Erlang编程语言对比分析及示例   本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...

  3. 配置python环境变量(转)

    默认情况下,在windows下安装python之后,系统并不会自动添加相应的环境变量.此时不能在命令行直接使用python命令. 1.首先需要在系统中注册python环境变量:假设python的安装路 ...

  4. python学习 变量的操作 与 基本数据类型

    一变量(本文使用python3.5): #变量:是计算机内存中的一块区域,变量可以存储规定范围内的值,变量可以改变#在python中变量是计算机内存中数据的引用 python的变量没有明显的类型,具体 ...

  5. python的变量传递

    python中变量都被视为对象的引用.python函数调用传递参数的时候,不允许程序员选择传值还是传引用,python参数传递采用的都是“传对象引用”的方式.     这种方式相当于传值和传引用的结合 ...

  6. Python中变量的作用域(variable scope)

    http://www.crifan.com/summary_python_variable_effective_scope/ 解释python中变量的作用域 示例: 1.代码版 #!/usr/bin/ ...

  7. Windows下python环境变量配置

    默认情况下,在windows下安装python之后,系统并不会自动添加相应的环境变量.此时不能在命令行直接使用python命令. 1. 首先需要在系统中注册python环境变量:假设python的安装 ...

  8. windows7下python环境变量配置

    默认情况下,在windows下安装python之后,系统并不会自动添加相应的环境变量.此时不能在命令行或cmd里直接使用python命令. 1. 首先需要在系统中注册python环境变量:假设pyth ...

  9. FAQ:Python环境变量配置

    Python安装安装成,需要配置环境变量: 默认情况下,在windows下安装python之后,系统并不会自动添加相应的环境变量.此时不能在命令行直接使用python命令. 1. 首先需要在系统中注册 ...

随机推荐

  1. Silverlight提示“Load 操作失败。远程服务器返回了错误: NotFound”

    调试时出现“Load 操作失败.远程服务器返回了错误: NotFound”: 一定要注意此错误之前的错误是什么?基本就是用户Cookie的问题,用户没有登录. 有时需要设置成Any CPU 有时重新编 ...

  2. servlet和jsp页面过滤器Filter的作用及配置

    刚刚有个朋友问我,Servlet的过滤器有什么作用? 现在发个帖子说明一下,            过滤器是一个对象,可以传输请求或修改响应.它可以在请求到达Servlet/JSP之前对其进行预处理, ...

  3. 【python】python之tuple元组

    tuple特性 python的tuple与列表类似,不同之处在于tuple的元素不能修改. tuple使用小括号,列表使用方括号. tuple创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. ...

  4. 解决MySQL5.6中的Slave延迟问题的基本教程

    一.原因分析一般而言,slave相对master延迟较大,其根本原因就是slave上的复制线程没办法真正做到并发.简单说,在master上是并发模式(以InnoDB引擎为主)完成事务提交的,而在sla ...

  5. AD域创建用户无法登录

    怎么登录都无法登录 解决办法: 创建用户的时候   将用户下次登录时须更改密码的勾去掉    不然需要修改密码才可以登录

  6. LUA 运算笔记

    循环 比如要实现这样的一个For for(int i=10;i>1;i—) { print(i) } lua的for循环 转换成LUA for i=10,1,-1 do print(i) end ...

  7. 【转】Nginx学习---深入浅出Nginx的介绍

    [原文]https://www.toutiao.com/i6595428119933354500/ Nginx是一款轻量级的Web服务器.反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在 ...

  8. git status 显示中文和解决中文乱码

    目录 git status 显示中文和解决中文乱码 解决git status不能显示中文 解决git bash 终端显示中文乱码 通过修改配置文件来解决中文乱码 git status 显示中文和解决中 ...

  9. csrf在web网站中有多重要

    小弟是学python的,今天在上网时看到一个商城网站,正好昨天学到了CSRF跨站请求,就对这个商城网站进行了一波测试 可以看到网页布局做的还是很不错的,然后进入了注册页面看看 之后就开始测试了 正常请 ...

  10. PyQt5--QLineEdit

    # -*- coding:utf-8 -*- ''' Created on Sep 20, 2018 @author: SaShuangYiBing Comment: ''' import sys f ...