浅析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 = 200 #对象属性
print t2.id #2
t1.id=100
print t2.id #2
#改变list的值
t1.list[0]='dd'
print t1.list #['dd', 'dd']
print t2.list #['dd', 'dd']
#对象属性
print t1.age #21
print t2.age #200

在这里,t1对象修改了id值,但是并不影响t2对象中的id值。通过t1对象改变list的值,其他对象对应的值也发生了改变。

为什么会这样呢?类属性分为两种:属性是immutable的(比如整数、字符串)。属性是mutable的话(比如list)

在更改对象属性时,如果属性是immutable的,该属性会被复制出一个副本,存放在对象的__dict__中。你可以通过下面的方式查看:

print t1.__class__.__dict__

print t1.__dict__

输出分别为

{‘__module__‘: ‘__main__‘, ‘name‘: ‘tt‘, ‘list‘: [‘dd‘, ‘dd‘], ‘__doc__‘: None, ‘__dict__‘: <attribute ‘__dict__‘ of ‘test‘ objects>, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘test‘ objects>, ‘id‘: 2, ‘change‘: <function change at 0xb723eb1c>}

{‘age‘: 21, ‘id‘: 100}

注意到类中和对象中各有一个id。一个为2, 一个为100。所以我们在查找a.Age的时候,会先查到对象的__dict__的值,也就是100。

但mutable的类属性,在更改属性值时,并不会有新的副本。所以更改会被所有的对象看到。

你可能会发现在对象的dict中多了一个age属性,这个属性就是对象属性,对象独有。

同理:

print t2.__class__.__dict__

print t2.__dict__

{‘__module__‘: ‘__main__‘, ‘name‘: ‘tt‘, ‘list‘: [‘dd‘, ‘dd‘], ‘__doc__‘: None, ‘__dict__‘: <attribute ‘__dict__‘ of ‘test‘ objects>, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘test‘ objects>, ‘id‘: 2, ‘change‘: <function change at 0xb72f0b1c>}

{}

说到这里,稍微总结一下:

1.age是对象属性,每一个对象独有的。修改对象属性不影响其他对象的属性值

2.每一个对象关联的class都有一个字典,每个对象初始化时,也存在一个字典,如果没有对对象中的属性赋值,该字典为空。

当使用对象.属性名来赋值的时候,如果是类中immutable类型属性,那么这就是所谓的副本。字典中就增加相应的属性和属性值。

如果是类中的mutable的话(比如list),该对象的字典中不会增加这个mutable属性。但是会修改类的字典的相应的属性值。

3.如果使用class.类属性名来修改类属性值的化,如果对象的字典为空的化,也就是还没有为通过对象名.属性名来赋值属性,那么对象.属性名将是class字典中的属性。

4.对象名.属性名 首先从自己对象字典中找属性,如果没有的话再去class字典中找。

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

时间: 2024-10-21 12:07:25

浅析python中的类变量和对象变量的相关文章

python中的类变量、实例变量

类变量,是各个实例共享的资源,就像中央空调,只有一个,但每个房间(实例)均可享用. 实例变量,是每个实例各自分配使用的变量,每个房间(实例)都有一台空调,供自己使用. class handle(object): instance_num = 100 id = 0 def __init__(self, id): self.id = id handle.instance_num = handle.instance_num - 1 if __name__ == '__main__': print ha

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

Python的类和C++一样,也都是存在两种类型的变量,类变量和对象变量!前者由类拥有,被所有对象共享,后者由每个对象独有.这里我主要想讨论一下他们的声明办法. 首先说的是对象变量: 只要是声明在类的语句块中,且没有"self."前缀的变量都是类变量,且类变量是被所有对象共享的. 注意红字部分,如果声明在类的方法的语句块中,那么就是局部变量了!比如下面这个例子: 1 #!/usr/bin/env python 2 # -* - coding: UTF-8 -* - 3 #Functio

浅析python中_name_=&#39;_main_&#39;

刚接触到python时,对代码中的_name_='_main_'比较疑惑,本文对其的讲解借鉴了其他博客讲述(见参考资料),希望和大家共同学习. Make a script both importable and executable 首先先看一个例子 1 #module.py 2 def main(): 3 print "we are in %s"%__name__ 4 if __name__ == '__main__': 5 main() 在这段函数中,定义main函数,当py文件被

Python中常见的文件对象内建函数

文件对象内建方法列表 文件对象的方法 操作 file.close() 关闭文件 file.fileno() 返回文件的描述符(file descriptor,FD,整数值) file.flush() 刷新文件的内部缓冲区 file.isatty() 判断file是否是一个类设tty备 file.next() 返回文件的下一行,或在没有其它行时引发StopIteration异常 file.read(size=-1) 从文件读取size个字节,当未给定size或给定负值时读取剩余的所有字节,然后作为

浅析python 中__name__ = &#39;__main__&#39; 的作用

很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = '__main__' 的作用,到底干嘛的? 有句话经典的概括了这段代码的意义: "Make a script both importable and executable" 意思就是说让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可执行. __name__ 是当前模块名,当模块

【转】浅析python 中__name__ = &#39;__main__&#39; 的作用

原文链接:http://www.jb51.net/article/51892.htm 举例说明解释的非常清楚,应该是看到的类似博文里面最简单的一篇: 这篇文章主要介绍了python 中__name__ = '__main__' 的作用,对于初学者来说很有帮助,需要的朋友可以参考下 很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = '__main__

简述Python中的类与对象

Python中的类 类的定义 示例: class Person: country = "China" def __init__(self, name, age): self.name = name self.age = age def speak(self, word): print(word) 其中 country 是类属性,即 Person类 的静态属性,speak() 为 Person类的函数属性,即类的动态属性~ 类的实例化 对上述示例的类进行实例化: >>>

python中的类和对象,属性和方法

一.面向对象的概述面向对象是一种描述业务问题.设计业务实体和实体之间关系的方法二.类和对象1.类和对象得区别:类是对客观世界中事物得抽象,而对象是类实例化后的实体   例如:汽车模型就是一个类,制造出来的每辆汽车就是一个对象2.类的定义:   (1)python使用class关键字定义一个类,类名的首字母一般要大写:       例如: class Student: #定义了一个Student类   (2)类的主体由一系列的属性和方法组成       例如: class Fruit: #定义一个

实习小记-python中不可哈希对象设置为可哈希对象

在这篇之前,我又专门翻译过官方python3.3的可哈希对象文档,大家可以先参考一下: 实习小记-python中可哈希对象是个啥?what is hashable object in python? 预备知识: 在定义一个类时,如果我们需要改写该类的__eq__函数,特别要注意的是它将会变为不可哈希对象,也就是说如果你将它放到哈希集会报错误 >>> class A: ... def __init__(self, x): ... self.x = x ... def __eq__(self