zoukankan      html  css  js  c++  java
  • 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、声明在方法内部,就是局部变量

  • 相关阅读:
    微信小程序
    微信小程序
    微信小程序
    微信小程序
    es5
    es5
    es5||es6
    es5
    5 个常用的软件质量指标
    Solr
  • 原文地址:https://www.cnblogs.com/douzi2/p/5580680.html
Copyright © 2011-2022 走看看