python中类变量,成员变量

参考文献:http://www.jb51.net/article/54286.htm

转载、引用请附上参考文献的链接。

(1)位置的区别

先看看下面这段代码:

 1 class TestClass(object):
 2   val1 = 100
 3
 4   def __init__(self):
 5     self.val2 = 200
 6
 7   def fcn(self,val = 400):
 8     val3 = 300
 9     self.val4 = val
10     self.val5 = 500
11  if __name__ == ‘__main__‘:
12   inst = TestClass()
13
14   print TestClass.val1
15   print inst.val1
16   print inst.val2
17   print inst.val3
18   print inst.val4
19   print inst.val5

这里,val1是类变量,可以由类名直接调用,也可以有对象来调用;
val2是成员变量,可以由类的对象来调用,这里可以看出成员变量一定是以self.的形式给出的,因为self的含义就是代表实例对象;
val3不是成员变量,它只是函数fcn内部的局部变量;
val4和val5也都不是成员变量,虽是以self.给出,但并没有在构造函数中初始化。

(2)如何修改这些变量、类变量和C++中的静态变量的区别

再看看下面的代码(#号后面的是运行结果):

 1 inst1 = TestClass()
 2 inst2 = TestClass()
 3
 4 print TestClass.val1 # 100
 5 print inst1.val1   # 100
 6
 7 inst1.val1 = 1000
 8 print inst1.val1   # 1000
 9 print TestClass.val1 # 100
10
11 TestClass.val1 =2000
12 print inst1.val1   # 1000
13 print TestClass.val1 # 2000
14
15 print inst2.val1   # 2000
16
17 inst3 = TestClass()
18 print inst3.val1   # 2000

可以发现:python的类变量和C++的静态变量不同,并不是由类的所有对象共享。类本身拥有自己的类变量(保存在内存),当一个TestClass类的对象被构造时,会将当前类变量拷贝一份给这个对象,当前类变量的值是多少,这个对象拷贝得到的类变量的值就是多少;而且,通过对象来修改类变量,并不会影响其他对象的类变量的值,因为大家都有各自的副本,更不会影响类本身所拥有的那个类变量的值;只有类自己才能改变类本身拥有的类变量的值。

时间: 2024-10-05 11:06:15

python中类变量,成员变量的相关文章

python无私有成员变量

python解释器将__init__函数里的__z变量转成 _classname__z了,明白规则后外部依然可以通过实力对象来访问. In [1]: class aa: ...: def __init__(self): ...: self.x = 10 ...: self.y = 11 ...: self.__z = 12 ...: In [2]: a = aa() In [3]: print a.x 10 In [4]: print a.y 11 In [5]: print a.__z ---

Objective-C中类的成员变量与属性

在Objective-C的类与对象的概念中. 成员变量与属性的区别与联系一直没有搞清楚. 直到学习了慕课网上的这个课程Objective-C面向对象初体验, 才算真正有了点感觉了. 最关键的结论就是: 类内使用成员变量{}, 类外使用属性@property. 成员变量 成员变量及其get方法. 首先, 我们来看下基本的类成员变量及其使用. // People.h @interface People : NSObject { NSString *_peopleName; } @end 在.m中不做

Python的类成员变量默认初始值的坑

问题发现:一个循环内,缺省值初始化同名变量,其中的list成员不是空,会延续之前同名变量的值. 示例代码: # Define class class Variant(): # use def __init__(self, price = 500, description = 'default description', values = ['', '', '']): self.price = price self.description = description self.values = v

JAVA中类以及成员变量和成员方法的修饰符的总结

一  类的修饰符 java中的文件结构由大到小为:一个工程,一个工程下可以有许多包,每个包中可以有许多类. 类的修饰符分为         访问权限修饰符          和             非访问权限修饰符 (1)访问权限修饰符: 1 public 公共类修饰符,public修饰的类可以被同一个包中的类访问,也可以被其他包中的类访问.即在此工程下的所有类都可以访问被public修饰的类.Java语言规定,程序的主类必须是公共类. 例如  public class Animal {..

Python类变量和成员变量使用中有哪些注意事项?

之前在用python开发一个项目,发现一个bug,就是同由一个类生成的两个实例之间的数据竟然会相互影响,这让我非常不解.后来联想到java的类有类变量也有实例变量,因此翻阅了相关资料,发现python也有类似的类变量和实例变量,比如下面的代码中: class A: x = 0 def __init__(self): self.y = 0 x就是类变量,y就是实例变量. 原则上是没有错的,但是实际用的时候就发现一些恶心的问题(也就是我找了三天的bug)...比如下面的代码: class A: x

Python中类的特殊变量

特殊变量 类似__xx,以双下划线开头的实例变量名,就变成了一个私有变量(private),只有内部可以访问,外部不能访问: 类似__xx__,以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,它不是private变量,下面会介绍Python中的常见特殊变量: 类似_x,以单下划线开头的实例变量名,这样的变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,"虽然我可以被访问,但是请把我视为私有变量,不要随意访问". 内置函数 typ

Objective-C Runtime 运行时之二:成员变量与属性

类型编码(Type Encoding) 作为对Runtime的补充,编译器将每个方法的返回值和参数类型编码为一个字符串,并将其与方法的selector关联在一起.这种编码方案在其它情况下也是非常有用的,因此我们可以使用@encode编译器指令来获取它.当给定一个类型时,@encode返回这个类型的字符串编码.这些类型可以是诸如int.指针这样的基本类型,也可以是结构体.类等类型.事实上,任何可以作为sizeof()操作参数的类型都可以用于@encode(). 在Objective-C Runti

局部变量和全局变量以及成员变量的区别

import <Foundation/Foundation.h> @interface Person : NSObject { // 写在类声明的大括号中的变量, 我们称之为 成员变量(属性, 实例变量) // 成员变量只能通过对象来访问 // 注意: 成员变量不能离开类, 离开类之后就不是成员变量 \ 成员变量不能在定义的同时进行初始化 // 存储: 堆(当前对象对应的堆的存储空间中) // 存储在堆中的数据, 不会被自动释放, 只能程序员手动释放 int age; } @end @impl

[Java入门笔记] 面向对象编程基础(三):成员变量和局部变量

在类中,变量根据定义的位置不同,可以分为成员变量和局部变量. 成员变量是在类体内,方法之外定义的变量,局部变量是在方法中定义的参数. 成员变量 成员变量分为类属性和实例属性,定义时没有static修饰的称为实例属性,有static修饰的称为类属性,类属性和实例属性的区别就是类属性是属于类的,它并不属于哪一个对象,它从这个类的准备阶段就一直存在,一直到这个类完全销毁.实例属性属于对象,只有某个对象被创建时,它才被创建,对象被回收,从属于该对象的实例属性也就被销毁了. 类属性的定义语法: [修饰符]

Objective-C 基本语法:实例变量与成员变量的区别.l........实例方法和类方法区别

http://leopard168.blog.163.com/blog/static/16847184420138153296930/ http://blog.csdn.net/thdxs/article/details/10988343 1.类方法是属于整个类,而不属于某个对象.2.类方法只能访问类成员变量,不能访问实例变量,而实例方法可以访问类成员变量和实例变量.3.类方法的调用可以通过类名.类方法和对象.类方法,而实例方法只能通过对象.实例方法访问.4.类方法只能访问类方法,而实例方法可以