类属性和对象属性|学习笔记

简介: 快速学习类属性和对象属性

开发者学堂课程【Python 入门 2020年版类属性和对象属性】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/639/detail/10379


类属性和对象属性

 

内容介绍:

一、对象属性

二、类属性

 

一、对象属性

之前的说道 self、魔法方法、内置属性以及把对象当成字典使用。

对象 p1和 p2是通过 Person 类创建出来的实例对象

class Person(object):

def __init__(self,name,age):

self.name = name

self.age = age

p1 = Preson(‘张三’,18)

p2 = Preson(‘李四’,19)

print(‘0x%X,0x%X’,%(id(p1),id(p2)))

运行后打印出两个地址

内存的图画:

image.png

现在有两个数据,一个内存内容是张三,还有一个的内存内容是李四。注意刚刚强调的对象 p1和 p2是通过 Person 类创建出来的实例对象,也就是 p1和 p2各自指向一段内存空间。

在这里会有一个小问题,Person 存在哪一个地方?

也就是 p1p2是根据模板创造出来的,找出模板的位置现在修改语句:print(‘0x%X’ % (id(Person)))

代码内容整理:

class Person(object):

def __init__(self,name,age):

self.name = name

self.age = age

p1 = Preson(‘张三’,18)

p2 = Preson(‘李四’,19)

print(‘0x%X‘ ,% (id(Person)))

运行后打印出 Perdon 的地址:

image.png

也就是现在的实例对象是根据模板创建出来的,有对应的内存地址,所以模板也是有存的内存地址。

CPU 的调动就相当于是在宾馆的前台,看哪一处的内存地址为空,就分配哪一块的内存空间。模板和根据模板创造的对象都保存在内存中,为了区分把 p1、p2成为实例对象,而模板叫类对象。

两个实例对象都是有自己的 name 和 age 属性,发现只要创建一个实例对象,就会保存它们自己的属性,这个每个实例对象都单独保存的属性。

如何获取对象属性的值?能不能获取到主要是看能不能获取到内存,所以直接用语句 print(p1.name)

代码内容整理:

class Person(object):

def __init__(self,name,age):

self.name = name

self.age = age

p1 = Preson(‘张三’,18)

p2 = Preson(‘李四’,19)

print(p1.name)

运行结果为:

image.png

如果加入 x =p1,就是定义了一个变量 x,曾经讲过在 python 语言中的赋值,等号是内存地址的赋值,所以此时x指向内存空间。就可以通过加入语句print(x.name)拿到张三这个变量内容

代码内容整理:

class Person(object):

def __init__(self,name,age):

self.name = name

self.age = age

p1 = Preson(‘张三’,18)

p2 = Preson(‘李四’,19)

print(p1.name)

print(x.name)

运行结果为:

image.png

只要能指向同一个内存空间就是可以完成该操作,name 和 age 是对象属性,是每一个实例对象都会单独保存一份的属性。每一个实例对象之间的属性没有关联,互不影响。

就是 p1的张三修改为 jack 对 p2的李四是没有影响的。

image.png

 

二、类属性

类属性是在类对象中定义的,比如现在对 Person 中加入一个 type,命名为人类。

name 和 age 这两个属性是在__init__方法里,以参数的形式定义的。而类属性是在类里面,函数之外的地方来写type = ‘人类‘,这个属性保存在类对象里,其他实例对象都没有保存这个属性。

类属性可以通过类对象和实例对象中获取

1. 通过类对象获取类属性,加入语句 print(Person.type)

代码内容整理:

class Person(object):

type = ‘人类’

def __init__(self,name,age):

self.name = name

self.age = age

p1 = Preson(‘张三’,18)

p2 = Preson(‘李四’,19)

print(Person.type)

运行结果为:

 image.png

2. 通过实例对象获取类属性,加入语句 print(p1.type)

代码内容整理:

class Person(object):

type = ‘人类’

def __init__(self,name,age):

self.name = name

self.age = age

p1 = Preson(‘张三’,18)

p2 = Preson(‘李四’,19)

print(Person.type)

print(p1.type)

print(p2.type)

运行结果为:

image.png

刚刚讲过 p1、p2没有保存 type 属性,也就是在 p1、p2中的内存是找不到 type 对象的。

那么它会因为自己没有而自动找到 Person 中的 type

下图为结构示意图:

image.png

总之,类属性是可以共享的。

(3)类属性只能通过类对象来修改,实例对象无法修改类属性

如果用p1.type = ‘human’,这个语句可能是在p1的内存空间中加入属性 type:human,或者是在 Person 中 type 的人类改为了 human。

注意这个地方是没有修改类属性的,而是给实例对象中加了一个对象属性。

image.png

整理代码内容为:

class Person(object):

type = ‘人类’

def __init__(self,name,age):

self.name = name

self.age = age

p1 = Preson(‘张三’,18)

p2 = Preson(‘李四’,19)

p1.type = ‘human’

print(p1.type)

运行结果为:

image.png

加入语句打印出 p2、Person,print(p2.type),print(Person.type)

运行结果为:最下面两个依然是人类


这就说明了当加入type:human只是加入了p1中的一个新的属性,并没有改到Person类中。此时p2中依然没有type,所以结果依旧为人类。

 image.png

print(p1.type)并不会修改类属性,而是给实例对象添加一个新的对象属性

如何修改类属性?

加入语句 Person .type = ‘monkey’,修改类属性

在打印 print(p2.type)

整理代码内容为:

class Person(object):

type = ‘人类’

def __init__(self,name,age):

self.name = name

self.age = age

p1 = Preson(‘张三’,18)

p2 = Preson(‘李四’,19)

p1.type = ‘human’

print(p1.type)

Person .type = ‘monkey’

print(p2.type)

运行结果为:

image.png

p2中没有 type 属性,就会上升到 Person 中寻找,已经做了修改为 monkey 的操作,所以此时结果为 monkey。

如图解析:

image.png

再加入语句打印出 p1,print(p1.type)

整理代码内容为:

class Person(object):

type = ‘人类’

def __init__(self,name,age):

self.name = name

self.age = age

p1 = Preson(‘张三’,18)

p2 = Preson(‘李四’,19)

p1.type = ‘human’

print(p1.type)

print(p2.type)

print(p1.type)

运行结果为:

image.png

由于 p1具有 type 属性,就不会再找 Person 类中的 type 属性,所以这个结果是 human

相关文章
|
10月前
|
Java
属性与this关键字
属性与this关键字
30 0
|
Java Scala 开发者
如何定义类和属性的使用|学习笔记
快速学习如何定义类和属性的使用。
108 0
|
JSON JavaScript 前端开发
18、属性描述对象
JavaScript 提供了一个内部数据结构,用来描述对象的属性,控制它的行为,比如该属性是否可写、可遍历等等。这个内部数据结构称为“属性描述对象”(attributes object)。
127 0
|
开发者 Python
属性和方法|学习笔记
快速学习 属性和方法
|
开发者 Python
隐藏类中的属性|学习笔记
快速学习 隐藏类中的属性
101 0
|
Python
类的属性总结
[root@blackfox zhouyuyao]# cat c7.py  #!/usr/bin/python #coding:utf8 var5 = "全局变量var5" class MyClass(object):     var1 = '类的公有属性 var1'   ...
751 0
|
JavaScript
继承 属性和方法
//为了数据共享,改变原型指向,做到了继承---通过改变原型指向实现的继承 //缺陷:因为改变原型指向的同时实现继承,直接初始化了属性,继承过来的属性的值都是一样的了,所以,这就是问题 //只能重新调用对象的属性进行重新赋值, //解决方案:继承的时候,不用改变原型的指向,直接调用父级的构造函数.
646 0
|
Java
构造器、对象数组、对象属性、静态实例块、this关键字
它的名字:构造函数、构造方法、初始化方法。 构造条件? 以后我们如何去使用构造器? 你觉得那些对象中那些属性值是必要的,你就在构造器中提出来(就是你如果想创造对象必须要传入我所需要的参数) public class Dog {//这里就是一个简单的类、狗的类 String name; .
1051 0