Python 类属性与实例属性的关联

类属性是属于一个类的变量,就像是C++中类的静态成员变量,你只需将该属性定义在所有方法的作用域外,即为类属性,但一般是紧跟在类名后面,类属性为所有实例所共有,你可以通过 类名.属性 来调用类属性

>>> class A:  
    count = 0; #这就是类属性  
    def __init__(self):  
        A.count += 1  #每次调用该方法 count 自增 1  
    def output(self):  
        print(self.count)  
  
>>> a1 = A()  
>>> a1.output()  
1  
>>> A.count = 0  
>>> A.count  
0  
>>> a1.output()  (为什么会是0,后面会详细说明)
0

实例属性是属于实例自己的属性,你可以在任何方法中添加新的实例属性,甚至在类外添加,Python会在实例属性初次使用时,创建该属性并赋值

>>> class A:  
    def __init__(self):  
        self.num = 1  #添加实例属性num  
    def again(self,name):  
        self.name = name #添加实例属性name  
  
          
>>> a1 = A()  
>>> a1.num  
1  
>>> a1.name #这时实例 a1 中还没有实例属性 name  
Traceback (most recent call last):  
  File "<pyshell#38>", line 1, in <module>  
    a1.name #这时实例 a1 中还没有实例属性 name  
AttributeError: ‘A‘ object has no attribute ‘name‘  
>>> a1.again(‘Jane‘)  
>>> a1.name #现在有了...  
‘Jane‘  
>>> a1.call = ‘123456‘ #添加a1的实例属性 call  
>>> a1.call  
‘123456‘

继续看下面的例子:

[python] view plaincopy
>>> class A:  
    count = 0  
    def __init__(self):  
        A.count += 1  
    def output(self):  
        print(self.count)  
  
          
>>> a1 = A()  
>>> a2 = A()  
>>> a3 = A()  
>>> A.count # A的类属性count这时为3  
3  
>>> A.count = 2 #更改A的类属性为2  
>>> a1.count,a2.count, a3.count, A.count #A的所有实例的count也同样改变  
(2, 2, 2, 2)  
>>> a1.count = 5 #通过A的一个实例a1更改count  
>>> a1.count, a2.count, a3.count, A.count #只有a1的count发生改变  
(5, 2, 2, 2)  
>>> A.count = 4 #再次更改A的类属性为4  
>>> a1.count, a2.count, a3.count, A.count  #这时a1的count还是保持为5  
(5, 4, 4, 4)

解释为什么会是0?

先看代码:

class base:
    count = 0
    def __init__(self):
        base.count += 1
    def output(self):
        print(self.count)
a1 = base()
a2 = base()
a3 = base()

print(base.count) # 3
a1.output() # 3  这里实例属性与类仍然还是共同引用一个count对象
base.count += 4
a1.output() # 3+4

print(base.count) # 3
print(a1.count) # 3 同理,共同引用一个count对象
base.count = 0 当改变类属性count时,实例属性count也跟着会变化
print(a1.count) # 0
class base:
    count = 0
    def __init__(self):
        base.count += 1
    def output(self):
        print(self.count)
a1 = base()
a2 = base()
a3 = base()

print(base.count) # 3
a1.count = 9  这个实例属性从类属性中分离出去
base.count += 4 因此类属性count的改变不会影响到实例属性count
print(base.count) # 7
print(a1.count) # 9

print(base.count) # 3
a1.count = 9
base.count += 4
print(base.count) # 7
a1.output() # 9

通过上面的例子我们可以看到,类属性为所有实例和类所共有,通过 类名.类属性 可以更改类属性,并且所有实例的类属性也随之改变,但通过 实例名.类属性 来改变类属性,该实例的该类属性会变为实例属性,而不影响其他实例的类属性,以后通过 类名.类属性 来更改类属性,也不会影响到该实例的这个属性了,因为它变为实例属性啦。

时间: 2024-08-06 20:06:56

Python 类属性与实例属性的关联的相关文章

Python之路-面向对象&amp;继承和多态&amp;类属性和实例属性&amp;类方法和静态方法

一.面向对象 编程方式 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强-" 什么是面向对象 面向对象就不像面向过程那样按照功能划分模块了,它所关注的是软件系统有哪些参与者,把这些参与者称为对象,找出这些软件系统的参与者也就是对象之后,分析这些对象有哪些特征.哪些行为,以及对象之间的关系,所以说面向对象的开发核心是对象 什么是类 面向对象编程的两个重要的概念:类和对象 类是

python中类对象、实例对象、类属性、实例属性、类方法、实例方法、静态方法

类对象.类属性与实例对象.实例属性的区别 在Python中一切皆是对象,类是一个特殊的对象即类对象,描述类的属性称为类属性.类属性在内存中只有一份,在__init__外部定义. 通过类创建的对象称为实例对象,描述实例对象的属性称为实例属性.实例属性在各自对象的内存中都保存一份,在__init__方法内部定义. 实例方法.类方法.静态方法的区别 这三种方法都是保存在类的内存中,调用者不同. 实例方法由对象调用,至少一个self参数,self代表对象的引用. 类方法有类调用,至少一个cls参数,并且

python学习-类属性和实例属性

#类属性和实例属性 class Tool(object): #类属性 total = 0 def __init__(self,new_name): #实例属性 self.name = new_name #类属性 Tool.total += 1 tool1 = Tool("a1") tool2 = Tool("a2") tool3 = Tool("a3") print(tool1.name) print(tool2.name) print(tool

Python:类属性,实例属性,私有属性与静态方法,类方法,实例方法

From: http://www.cnblogs.com/pengsixiong/p/4823473.html 属性分为实例属性与类属性 方法分为普通方法,类方法,静态方法 一:属性: 尽量把需要用户传入的属性作为实例属性,而把同类都一样的属性作为类属性.实例属性在每创造一个类是都会初始化一遍,不同的实例的实例属性可能不同,不同实例的类属性都相同.从而减少内存. 1:实例属性: 最好在__init__(self,...)中初始化 内部调用时都需要加上self. 外部调用时用instancenam

python 类属性与实例属性

#__author__ = 'juzi_juzi' #类属性与实例属性 #1.无法通过类访问实例属性: #2.类属性归类所所有,但是所有实例都可访问: #3.如果存在相同名称的类属性与实例属性,实例访问的时候会优先使用实例属性,实例找不到该属性再找类属性: #4.实例修改了类属性值,但原类属性对应的值仍存在: class Test(): count = 3 # count 为类属性: def __init__(self,name,age): self.name = name #name ,age

Python中类属性和实例属性的区别

在Python中经常会混淆类属性和实例属性的概念,今天专门记录一下个人理解以免日后忘记. 看下面的例子: class Tencent(): i = 10 # 此处i为类属性 def __init__(self,name): self.name = name # 此处name为实力属性 def function(self): print(self.name) a = Tencent(100) #实例化 print(a.i) print(a.name) print(Tencent.i) 运行当然是没

Python3.x基础学习-类--类属性和实例属性

类属性和实例属性 定义: 实例属性:在实例对象中定义的属性类属性: 在类对象中定义的属性,并且多个实例对象共享一份类属性类属性使用方式:类名.类属性,也可以使用 对象.类属性注意: 1.不可变类型:对象名.属性名=属性值 是给对象添加属性,而不是进行修改 2. 可变类型:如果对象是修改可变数据类型变量中的数据,是真正的修改如果是重新给可变数据类型变量赋值,这是给该对象添加属性 class Dog: pass dog=Dog dog.name = '旺财' print(dog.name) dog.

python基础1-类属性和实例属性

类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,这个和C++中类的静态成员变量有点类似.对于公有的类属性,在类外可以通过类对象和实例对象访问 类属性 class people: name = 'Tom' #公有的类属性 __age = 12 #私有的类属性 p = people() print p.name #正确 print people.name #正确 print p.__age #错误,不能在类外通过实例对象访问私有的类属性 print people

python 类和对象的属性

python类和对象的属性分为类属性和对象属性两大类,类属性属于类,而对象属性属于对象. 1. 父类的对象属性会被子类的对象继承. 2. 父类的类属性会被子类继承,还是作为类属性,如果父类改变了类属性,父类和子类的类属性都会被改变. 3. 子类继承父类的类属性可以通过类名+属性名使用,但是一旦发生赋值,就会新定义一个相同名字的子类自己的类属性. 4. 类的对象可以通过对象名+属性名使用类属性,但是一旦发生赋值,就会新定义一个相同名字的对象属性,而且不会被继承. eg: >>> class

类属性、实例属性

属性分为实例属性与类属性 方法分为普通方法,类方法,静态方法 一:属性: 尽量把需要用户传入的属性作为实例属性,而把同类都一样的属性作为类属性.实例属性在每创造一个类是都会初始化一遍,不同的实例的实例属性可能不同,不同实例的类属性都相同.从而减少内存. 1:实例属性: 最好在__init__(self,...)中初始化 内部调用时都需要加上self. 外部调用时用instancename.propertyname 2:类属性: 在__init__()外初始化 在内部用classname.类属性名