Python的类变量和对象变量声明解析

  Python的类和C++一样,也都是存在两种类型的变量,类变量和对象变量!前者由类拥有,被所有对象共享,后者由每个对象独有。这里我主要想讨论一下他们的声明办法。

  首先说的是对象变量:

    只要是声明在类的语句块中,且没有"self."前缀的变量都是类变量,且类变量是被所有对象共享的。

  注意红字部分,如果声明在类的方法的语句块中,那么就是局部变量了!比如下面这个例子:

 1 #!/usr/bin/env python
 2 # -* - coding: UTF-8 -* -
 3 #Function: Use the class var
 4
 5 class Person:
 6     cvar = 1
 7     def sayHi(self):
 8       fvar = 1
 9
10 print Person.cvar
11 print Person.fvar

  那个cvar就是属于Python类的变量,而那个fvar就是方法sayHi()中的局部变量,第11条语句那里就会报错!

  接下来我们再来讨论一下对象变量的声明方法:

    在类的语句块及其中方法的语句块中声明的以“self.”开头的变量都是对象变量,由对象独有!

  比如下面这个例子:

 1 #!/usr/bin/env python
 2 # -* - coding: UTF-8 -* -
 3 #Function: Use the object var
 4
 5 class Person:
 6     def haveName(self):
 7       self.name = ‘Michael‘
 8     def sayName(self):
 9       print self.name
10
11 def main():
12     p = Person()
13
14     p.haveName()
15     p.sayName()
16
17 main()

  这里在haveName()方法中声明了一个对象变量,然后再在sayName()方法中调用。然后主程序中就会输出了!

  不过建议将对象变量声明在__init__()方法中,因为对象一被创建的时候即会调用这个方法,否则的话,比如上面那个例子,如果我先调用sayName()的话,那么就会出错,说对象实例还没有name这个属性!

  最后还想说的一点的就是,Python中没有private public这些关键字来标明类的变量或者方法的访问权限,但是可以通过在变量或者方法的前面加上"__"来表明这个成员是被类私有的,不能在外部调用,比如下面这个例子:

 1 #!/usr/bin/env python
 2 # -* - coding: UTF-8 -* -
 3 #Function: Use the private var and func
 4
 5 class Person:
 6     __count = 0            #这个变量是私有数据成员,只能被类的方法访问,是属于类的
 7     def get(self):
 8       return Person.__count
 9     def __pri(self):
10       print ‘Yes‘
11
12 p = Person()
13 print p.get()
14
15 p.__pri()
16 print p.__count

  比如这里的类变量__count就是类私有的,只能被类的函数成员调用(13行),而在类外面调用(16行)就是错误的!还有那个函数成员__pri()也是私有的,在类外面直接调用(15行),也是错误的!

时间: 2024-07-31 01:50:44

Python的类变量和对象变量声明解析的相关文章

python的类变量和对象变量[转]

原文章:https://www.cnblogs.com/gtarcoder/p/5005897.html python是一种解释性的语言,任何变量可以在使用的时候才声明以及定义,也可以在程序运行的任何位置进行声明和定义新的变量. class Man(object): #直接定义的类的变量,属于类 #其中 gender, avg_height为基本数据类型,immutable #lis为列表类型,为mutable的 gender = 'male' avg_height = 1.75 lis = [

浅析python中的类变量和对象变量

刚学python,学到了有关于类和对象的地方.对一个概念有点模糊,后来通过实践编码找到一定规律 在python中 class test(object): id=2 name='tt' list=['tt','dd'] def change(self,newA,new_id): self.id=new_id self.age=newA return self.age t1 = test() t1.change(21, 3) print t1.id #3 t2 = test() t2.age = 2

【类不类二】Python的类变量与实例变量

在研究类的时候,难免会有很多疑问,C论坛和博客园高手如云(不知道是不是也美女如云), 搜到了这篇博文,是介绍Python的类变量和实例变量的 ! 刚好在下对self.***这种形式的实例变 量不是很理解,就拿来与诸君共享! C博客的大伽: http://blog.csdn.net/xxkkff/article/details/4396895 上一篇[类不类2]: http://www.cnblogs.com/Ruby517/p/5709558.html 一般的类定义是写成这种形式 class <

类变量和对象变量

先上代码: class Man(): #直接定义的类的变量,属于类 #其中 gender, avg_height为基本数据类型,immutable #lis为列表类型,为mutable的 gender = 'male' avg_height = 1.75 lis = ['hello', 'world'] def __init__(self, name): self.name = name #name在类的构造函数中定义,是属于对象的变量 a = Man('jason') b = Man('tom

Python的类变量和成员变量

先说明几个相关的术语:attribute.function.method. attribute:类对象的数据成员.我们经常会在Python代码出错时遇到:"AttributeError: 'My_Class' object has no attribute 'memberxxx'" function:普通函数 method:类方法 示例代码:

python面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法

1. 类对象和实例对象 Python中一切皆对象,Python类本身也是一种对象,类定义完成后,会在当前作用域中定义一个以类名为名字的命名空间.类对象具有以下两种操作: 可以通过"类名()"的方式实例化一个对象. 可以通过"类名.类属性"的方式来访问一个类属性. 如果说类时一种概念性的定义,是一种类别,那么实例对象就是对这一类别的具体化.实例化,即实例化对象是类对象实例化之后的产物. class Person:# 声明一个类对象 pass p1 = Person()

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

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

python——实例方法、静态方法、类方法、类变量和实例变量浅析

概述: 实例方法就是类的实例能够使用的方法. 静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作.使用装饰器@staticmethod定义静态方法.类对象和实例都可调用静态方法. 类方法是将类本身作为对象进行操作的方法.类方法使用@classmethod装饰器定义,其第一个参数是类,约定写为cls.类对象和实例都可以调用类方法. super用来执行父类中的函数. 类变量定义在类的定义之后,实例变量则是以为self.开头. 如何调用父类的构造函数:子类(派生类)并不会自

【JavaScript】4、执行环境、变量对象与声明提前

这段时间一直在看一些关于JavaScript的书,看到不明白的地方就满世界搜解答,结果今天晚上在搜索一个奇怪的语法的时候不小心点开一道面试题,是一道考察作用域的十年老题,于是我试着做了一下,果断被坑,结束后看解析,看得也不是很明白,于是赶紧回去看基础书,结果发现以前很多自己一眼扫过的知识点自己完全没有掌握,瞬间后悔万分,所以趁势赶紧重新学一下,同时把这些这些点记录下来. 原题是这样的: var tt = 'aa'; function test(){ alert(tt); var tt = 'dd