类变量和对象变量

  • 先上代码:
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')

#通过一个对象a访问一个变量x,变量的查找过程是这样的:
#先在对象自身的__dict__中查找是否有x,如果有则返回,否则进入对象a所属的类A的
#__dict__中进行查找

#对象a试图修改一个属于类的 immutable的变量,则python会在内存中为对象a
#新建一个gender变量,此时a就具有了属于自己的gender变量
a.gender = 'female'

#对象b直接调用给类变量进行Man.lis赋值等容易认为新建对象的方法,会直接给对象b新建这个对象
b.lis = ['olleh', 'world']
#若为append等建立在已有对象的基础上的方法则会去修改类变量
#b.lis.append('new')
#print ('a.lis',a.lis)
#print ('b.lis',b.lis)
#print('class.lis:',Man.lis)

#可用对象的.__class__方法找到对象的类,然后修改类变量
a.__class__.lis = ['hello', 'dlrow']

Man.t = 'test' #此时Man的变量又多了t,但是对象a和b中没有变量t。
a.addr = '182.109.23.1' #给对象a定义一个变量,对象b和类Man中都不会出现

print ('a:dict',a.__dict__) #属于a的变量,有 name, gender, addr
print ('b:dict',b.__dict__)  #属于b的变量,只有name
print ('class man dict:',Man.__dict__) #属于类Man的变量,有 gender,avg_height,lis,但是不包括 name
#name是属于对象的变量 

print ('a.gender:',a.gender)  #female
print ('b.gender:',b.gender)  #male

print ('a.lis',a.lis) #['hello', 'dlrow']
print ('b.lis',b.lis) #['olleh', 'world']
print('class.lis:',Man.lis)#['hello', 'dlrow']


output:

a:dict {'name': 'jason', 'gender': 'female', 'addr': '182.109.23.1'}
b:dict {'name': 'tom', 'lis': ['olleh', 'world']}
class man dict: {'__module__': '__main__', 'gender': 'male', 'avg_height': 1.75, 'lis': ['hello', 'dlrow'], '__init__': <function Man.__init__ at 0x7f1f39f23bf8>, '__dict__': <attribute '__dict__' of 'Man' objects>, '__weakref__': <attribute '__weakref__' of 'Man' objects>, '__doc__': None, 't': 'test'}
a.gender: female
b.gender: male
a.lis ['hello', 'dlrow']
b.lis ['olleh', 'world']
class.lis: ['hello', 'dlrow']
未完待续...

原文地址:https://www.cnblogs.com/katachi/p/9986627.html

时间: 2024-08-30 14:45:21

类变量和对象变量的相关文章

浅析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的类变量和对象变量声明解析

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

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面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法

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

类变量和实例变量的区别

1.简介:       1.类变量也叫静态变量,也就是在变量前加了static 的变量:       2.实例变量也叫对象变量,即没加static 的变量: 区别在于:类变量和实例变量的区别在于:类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果:而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象: 例: 1 public class A{ 2 static int a = 0; //类变量 3 private int b = 0; //实力变量 4 } 5

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

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

怎么区分类变量和实例变量?

# -*- coding: utf-8 -*- #python 27 #xiaodeng #怎么区分类变量和实例变量? #实例变量:在变量前面添加了self,就是实例变量,比如:self.name(完整定义为:属于实例私有,对实例变量的操作不会影响到其他的实例对象) #类变量:不添加前缀self,就是类变量(完整定义为:被该类的所有实例可以共享的变量,如果某个实例修改了该变量,这个变量可以被其他实例看到) class Person() : count = 0 def __init__(self,

变量:类变量,实例变量

1. 分类 分为类变量(静态变量.全局变量).实例变量.局部变量.其中静态变量.实例变量的区别是是否被static修饰 2. 类变量与实例变量在内存和调用上的区别 (1)调用:类变量是用"类名.变量名"格式来调用,实例变量通过"对象名.变量名"格式来调用 (2)内存: 类变量在类加载的时候就被初始化,而实例变量在对象new 出来后初始化. 类变量单独划分一块内存区域,独立于该类的任何对象.也就是说,不依赖于特定的实例,被类的所有实例共享: 实例变量在对象new出来后