C++和python的变量对比
《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的变量对比的更多相关文章
- Go/Python/Erlang编程语言对比分析及示例
本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性,不过最主要的原因是这几个我比较熟悉. Go的很多语言特性借鉴 ...
- Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!
Go/Python/Erlang编程语言对比分析及示例 本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...
- 配置python环境变量(转)
默认情况下,在windows下安装python之后,系统并不会自动添加相应的环境变量.此时不能在命令行直接使用python命令. 1.首先需要在系统中注册python环境变量:假设python的安装路 ...
- python学习 变量的操作 与 基本数据类型
一变量(本文使用python3.5): #变量:是计算机内存中的一块区域,变量可以存储规定范围内的值,变量可以改变#在python中变量是计算机内存中数据的引用 python的变量没有明显的类型,具体 ...
- python的变量传递
python中变量都被视为对象的引用.python函数调用传递参数的时候,不允许程序员选择传值还是传引用,python参数传递采用的都是“传对象引用”的方式. 这种方式相当于传值和传引用的结合 ...
- Python中变量的作用域(variable scope)
http://www.crifan.com/summary_python_variable_effective_scope/ 解释python中变量的作用域 示例: 1.代码版 #!/usr/bin/ ...
- Windows下python环境变量配置
默认情况下,在windows下安装python之后,系统并不会自动添加相应的环境变量.此时不能在命令行直接使用python命令. 1. 首先需要在系统中注册python环境变量:假设python的安装 ...
- windows7下python环境变量配置
默认情况下,在windows下安装python之后,系统并不会自动添加相应的环境变量.此时不能在命令行或cmd里直接使用python命令. 1. 首先需要在系统中注册python环境变量:假设pyth ...
- FAQ:Python环境变量配置
Python安装安装成,需要配置环境变量: 默认情况下,在windows下安装python之后,系统并不会自动添加相应的环境变量.此时不能在命令行直接使用python命令. 1. 首先需要在系统中注册 ...
随机推荐
- Flutter Widgets (Container/Row/Column/Image)
俗话说知己知彼百战百胜,如果对Flutter 里面的各种Widgets不了解,那你就别想将它们组合成你想要的效果.从今天开始.会把一个一个的widget 撸一遍..知道它大概的用法.效果.当你想做某个 ...
- show命令
数据库 show databases; 表 show tables; show tables in xxdb; show tables 'a*'; tblproperties show tblprop ...
- springcloud 入门 3 (服务之间的调用)
服务调用: 指的是注册到服务端上的客户端之间数据的相互调用问题:服务与服务的通讯是基于http restful的 服务直接调用主要有两种实现:ribbon 和 feign ribbon是实现负载均衡 ...
- excel、xls文件读写操作
python 常用的excel.xls文件读写操作,有两个模块 xlrd:读 xlwt:写 本次先写一个读的例子: class CaseData(object): def __init__(self, ...
- LeetCode题解之Convert Sorted List to Binary Search Tree
1.题目描述 2.题目描述 使用快慢指针寻找链表中间值. 3.代码 TreeNode* sortedListToBST(ListNode* head) { if (head == NULL) retu ...
- Node.js+Ajax实现物流小工具
半年过去了,好像什么也没干,好像什么也干了. 最近在网易云课堂上看到了这个课程,觉得很有意思,就跟着课程做了一遍,课程地址:http://study.163.com/course/courseMain ...
- python常用模块之string
python常用模块string模块,该模块可以帮我们获取字母.数字.特殊符号. import string #打印所有的小写字母 print(string.ascii_lowercase) #打印所 ...
- 工作中遇到的问题收集--.NET
一.拒绝访问 temp 目录.用来运行 XmlSerializer 的标识“IIS APPPOOL\MZJYMIS”没有访问 temp 目录的足够权限.CodeDom 将使用进程正在使用的用户帐户进行 ...
- Python socket应用
Server端: #-*- coding: UTF-8 -*- import socket,time host='192.168.0.9' port=12307 s=socket.socket(soc ...
- NFS网络共享介绍与使用
什么是NFS(网络文件系统)? NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源.它的主要功 ...