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

Posted 禾田守望者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python的类变量和对象变量[转]相关的知识,希望对你有一定的参考价值。

原文章:https://www.cnblogs.com/gtarcoder/p/5005897.html

__dict__里存着{"属性名":属性值}.

python是一种解释性的语言,任何变量可以在使用的时候才声明以及定义,也可以在程序运行的任何位置进行声明和定义新的变量。

class Man(object):
    #直接定义的类的变量,属于类   
    #其中 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\')
 
#通过一个对象a访问一个变量x,变量的查找过程是这样的:
#先在对象自身的__dict__中查找是否有x,如果有则返回,否则进入对象a所属的类A的
#__dict__中进行查找
 
#对象a试图修改一个属于类的 immutable的变量,则python会在内存中为对象a
#新建一个gender变量,此时a就具有了属于自己的gender变量
a.gender = \'female\'
 
#对象b试图修改一个mutable的变量,则python找到类Man的__dict__中的变量lis,
#由于lis是可以修改的,因此直接进行修改,而不会给b新生成一个变量。类Man以及类Man
#的所有对象都公用这一个lis
b.lis = [\'fuck\', \'world\']
 
print a.__dict__ #属于a的变量,有 name, gender
print b.__dict__  #属于b的变量,只有name
print Man.__dict__ #属于类Man的变量,有 gender,avg_height,lis,但是不包括 name
#name是属于对象的变量
 
Man.t = \'test\' #此时Man的变量又多了t,但是对象a和b中没有变量t。
#(这里可以看出,对象的变量和类的变量是分开的)
 
print a.gender  #female
print b.gender  #male
 
print a.lis #[\'fuck\', \'world\']
print b.lis #[\'fuck\', \'world\']
 
a.addr = \'182.109.23.1\' #给对象a定义一个变量,对象b和类Man中都不会出现(解释性语言好随性。。)

需要注意,类的变量(属性)和对象的变量(属性)是“独立”的,但在通过一个对象查找一个变量的时候,会现在改对象自身的__dict__中查找,如果找不到,则进入该对象代表的类的__dict__中进行查找。

 

以上是关于python的类变量和对象变量[转]的主要内容,如果未能解决你的问题,请参考以下文章

[转]如何写出线程安全的类和函数

python中的类

# yyds干货盘点 # Python面向对象中的类变量,实例变量怎么来理解?

web代码片段

C#-WebForm-★内置对象简介★Request-获取请求对象Response相应请求对象Session全局变量(私有)Cookie全局变量(私有)Application全局公共变量Vi(代码片段

为啥 Python 类初始化变量不能用于包导入中的类实例对象,但否则?