Python类和对象----实例属性,类属性(这是我理解类和对象最透彻的一次!!)

目录

1.定义

2.属性

1.实例属性

1.添加

2.查询

3.修改

4.删除

5.不同对象之间不能互相访问对方的属性

2.类属性

1.添加

2.查询

3.修改

4.删除

5.类属性的内存存储问题

6.类属性被各个对象共享

3.对象属性和类属性之间的区别联系

4.如何限制一个对象添加属性?


1.定义

类实例化对象,对象抽象为类。

如何定义一个类:

class 类名:

pass

如何通过类,创建一个对象:

class Person:

pass

根据这个类,创建(实例化)一个对象

p1=Person()

复制代码
#新式类
#定义一个类
class Money:
    pass

print(Money.__name__)
Money
xxx=Money
print(xxx.__name__)
Money

#Money=666
#print(Money)
#666
#id(Money)
#3284558917232

#根据这个类,创建(实例化)一个对象
one=Money()
print(one)
<__main__.Money object at 0x000002FCBF0F68C0>
one.__class__
<class '__main__.Money'>

类的定义会占用内存,Money是类的名称,也是一个变量名,类不管怎么赋值,类的类名就是Money;

Money是变量,所以可以改,Money引用着当前这个类(Money),Money=666,改的是Money变量的指向,而不是改的类名;

2.属性

1.实例属性
1.添加

1>直接通过对象,动态添加:对象名.对象属性=值;

2>通过类的初始化方法(构造方法): __init__方法

2.查询

1>对象名.对象属性

2>查看对象的所有属性:对象.dict

复制代码
#定义一个类
>>> class Person:
	pass

#根据类,创建一个对象
>>> p=Person()

给p对象 增加一些属性
>>> p.age=18
>>> p.height=180

验证是否增加成功(查询)
>>> p.age
18
>>> p.__dict__
{'age': 18, 'height': 180}
3.修改

对象名.对象属性=值

复制代码
#修改
>>> p.age=123
>>> p.age
123

>>> p.pets=["小花","小黑"]
>>> print(p.pets,id(p.pets))
['小花', '小黑'] 2467556003720
>>> p.pets=[1,2]
>>> print(p.pets,id(p.pets))
[1, 2] 2467556009224


>>> p.pets=["小花","小黑"]
>>> print(p.pets,id(p.pets))
['小花', '小黑'] 2467556008264
>>> p.pets.append("小黄")
>>> print(p.pets,id(p.pets))
['小花', '小黑', '小黄'] 2467556008264
4.删除

del 对象名.对象属性

复制代码
>>> p.age=18
>>> del p.age
>>> print(p.age)
Traceback (most recent call last):
  File "<pyshell#23>", line 1, in <module>
    print(p.age)
AttributeError: 'Person' object has no attribute 'age'
5.不同对象之间不能互相访问对方的属性
复制代码
>>> class Person:
	pass
  
>>> p1=Person()
>>> p2=Person()

>>> p1.age=18
>>> p2.address='上海'

>>> print(p1.address)
Traceback (most recent call last):
  File "<pyshell#28>", line 1, in <module>
    print(p1.address)
AttributeError: 'Person' object has no attribute 'address'
2.类属性

万物皆对象,类也是一个对象

1.添加

1> 类名.类属性=值

复制代码
>>> class Money:
	pass

>>> Money.count=1
>>> print(Money.count)
1
>>> print(Money.__dict__)
{'__module__': '__main__', '__dict__': <attribute '__dict__' of 'Money' objects>, '__weakref__': <attribute '__weakref__' of 'Money' objects>, '__doc__': None, 'count': 1}

2>

class Dog:

dogCount=0

复制代码
>>> class Money:
	age=18
	count=1
	num=666

	
>>> print(Money.age,Money.count,Money.num)
18 1 666
>>> print(Money.__dict__)
{'__module__': '__main__', 'age': 18, 'count': 1, 'num': 666, '__dict__': <attribute '__dict__' of 'Money' objects>, '__weakref__': <attribute '__weakref__' of 'Money' objects>, '__doc__': None}
2.查询

1>

通过类访问:类名.类属性

查看一个类的所有属性:类名.dict

复制代码
>>> class Money:
	age=18
	count=1
	num=666

	
>>> print(Money.age,Money.count,Money.num)
18 1 666
>>> print(Money.__dict__)
{'__module__': '__main__', 'age': 18, 'count': 1, 'num': 666, '__dict__': <attribute '__dict__' of 'Money' objects>, '__weakref__': <attribute '__weakref__' of 'Money' objects>, '__doc__': None}

2>

通过对象访问:对象名.类属性

为什么可以通过对象访问到类属性?

和python对象的属性查找机制有关

优先到对象自身查找属性,找到就结束;

若未找到,则根据__class__找到对象对应的类,到这个类里面查找

复制代码
>>> class Money:
	age=18
	count=1
	num=666


>>> one=Money()
>>> print(one.__class__)
<class '__main__.Money'>

#未找到,则根据__class__找到对象对应的类,到这个类里面查找
>>> print(one.age,one.count,one.num)
18 1 666
复制代码
>>> class Test:
	sex='男'

>>> class Money:
	age=18
	count=1
	num=666

>>> one=Money()
>>> print(one.__class__)
<class '__main__.Money'>

>>> one.__class__=Test
>>> print(one.__class__)
<class '__main__.Test'>

>>> print(one.age)
Traceback (most recent call last):
  File "<pyshell#59>", line 1, in <module>
    print(one.age)
AttributeError: 'Test' object has no attribute 'age'

>>> print(one.sex)
男

#优先到对象自身查找属性,找到就结束
>>> one.sex='女'
>>> print(one.sex)
女
3.修改

1>通过类名改:类名.类属性=值

复制代码
>>> class Money:
	age=18
	count=1
	num=666

	
>>> Money.age=22
>>> print(Money.age)
22

2>不能通过对象改

自己操作本身,有就修改,没有就新增

复制代码
>>> class Money:
	age=18
	count=1
	num=666

	
>>> one=Money()
>>> one.xxx=999
>>> print(one.xxx)
999

>>> print(Money.age)
18
>>> one.age=777
>>> print(Money.age)
18
>>> print(one.__dict__)
{'xxx': 999, 'age': 777}
4.删除

1>通过类名删除:del 类名.类属性

复制代码
>>> class Money:
	age=18
	count=1
	num=666

>>> one=Money()
>>> print(Money.age,one.age)
18 18

>>> del Money.age

>>> print(Money.age)
Traceback (most recent call last):
  File "<pyshell#86>", line 1, in <module>
    print(Money.age)
AttributeError: type object 'Money' has no attribute 'age'

>>> print(one.age)
Traceback (most recent call last):
  File "<pyshell#87>", line 1, in <module>
    print(one.age)
AttributeError: 'Money' object has no attribute 'age'

2>不能通过对象删除,del语句只删除直系属性

复制代码
>>> class Money:
	age=18
	count=1
	num=666
	
>>> one=Money()
>>> del one.age
Traceback (most recent call last):
  File "<pyshell#92>", line 1, in <module>
    del one.age
AttributeError: age
5.类属性的内存存储问题

一般情况下,属性存储在__dict__的字典中,有些内置对象没有__dict__属性

复制代码
>>> class Money:
	pass

>>> one=Money()
>>> one.age=18
>>> one.height=180
>>> print(one.__dict__)
{'age': 18, 'height': 180}
>>> one.age=19
>>> print(one.__dict__)
{'age': 19, 'height': 180}

一般对象可以直接修改__dict__属性

复制代码
>>> class Money:
	pass

>>> one=Money()
>>> one.__dict__={"name":"Sz","age":18}

>>> print(one.name)
Sz
复制代码
>>> class Money:
	age=18
	name="Sz"

	
>>> one=Money()
>>> one.age=18
>>> one.height=180
>>> one.__dict__["age"]=999
>>> print(one.age)
999

类对象的__dict__为只读,默认无法修改,可以通过setattr方法修改

复制代码
>>> class Money:
	age=18
	name="Sz"
	
>>> print(Money.__dict__)
{'__module__': '__main__', 'age': 18, 'name': 'Sz', '__dict__': <attribute '__dict__' of 'Money' objects>, '__weakref__': <attribute '__weakref__' of 'Money' objects>, '__doc__': None}

>>> Money.__dict__={"sex": '男'}
Traceback (most recent call last):
  File "<pyshell#113>", line 1, in <module>
    Money.__dict__={"sex": '男'}
AttributeError: attribute '__dict__' of 'type' objects is not writable

>>> Money.__dict__["age"]=20
Traceback (most recent call last):
  File "<pyshell#114>", line 1, in <module>
    Money.__dict__["age"]=20
TypeError: 'mappingproxy' object does not support item assignment
6.类属性被各个对象共享
复制代码
>>> class Money:
	age=18
	name="Sz"

	
>>> one=Money()
>>> two=Money()
>>> print(one.age,two.age)
18 18
>>> Money.age=20
>>> print(one.age,two.age)
20 20
3.对象属性和类属性之间的区别联系

1>存储地点不一样,类属性存储在类里面,对象属性存储在对象里面;

2>抽象层次不一样,一个是类,一个是根据这个类创建出来的对象,类的抽象层次更高;

3>类属性和对象属性的宿主不一样,类属性的宿主是类,对象属性的宿主是对象,

因为宿主不同,导致类属性和对象属性的操作不同,对象属性的增删改查必须通过对象,

类属性的增删改查必须通过类访问;

新增查询有些不同:

新增不同,新增类属性可以直接写在类里面,

查询不同,类属性可以通过对象来访问

复制代码
>>> class Person:
	age=10
	
>>> p=Person()

#p.age=p.age+5 这是一个赋值语句,先算右边的,
#右边的p.age相当于查询,查询到p.age=10,则p.age=10+5,这一步相当于新增p对象自己的属性
>>> p.age+=5
>>> print(Person.age)
10
>>> print(p.age)
15
4.如何限制一个对象添加属性?

通过类属性__slots__,只有在slots列表中有的,Person类的对象才能添加该属性。

复制代码
>>> class Person:
	__slots__=['age']

	
>>> p1=Person()
>>> p1.age=1
>>> p1.num=2
Traceback (most recent call last):
  File "<pyshell#141>", line 1, in <module>
    p1.num=2
AttributeError: 'Person' object has no attribute 'num'

>>> p2=Person()
>>> p2.age=8
>>> p2.num=9
Traceback (most recent call last):
  File "<pyshell#144>", line 1, in <module>
    p2.num=9
AttributeError: 'Person' object has no attribute 'num'
相关推荐
超奇电子2 小时前
高斯包络调制正弦波的Python代码
开发语言·python
合作小小程序员小小店2 小时前
桌面预测类开发,桌面%雷达,信号预测%系统开发,基于python,tk,scikit-learn机器学习算法实现,桌面预支持向量机分类算法,CSV无数据库
python·算法·机器学习·支持向量机·scikit-learn
Etherious_Young2 小时前
用u2写一个实况足球图像识别自动化脚本(2)
python·自动化
java1234_小锋2 小时前
Scikit-learn Python机器学习 - 聚类分析算法 - Agglomerative Clustering(凝聚层次聚类)
python·算法·机器学习
扑克中的黑桃A2 小时前
Python快速入门专业版(九):字符串进阶:常用方法(查找、替换、分割、大小写转换)
python
Siren_dream2 小时前
python进阶_Day2
开发语言·python
珹洺2 小时前
Java-Spring入门指南(十二)SpringAop的三种实现方式
java·开发语言·spring
做运维的阿瑞2 小时前
使用 Python 打造一个轻量级系统信息查看器
开发语言·后端·python·系统架构
磨十三3 小时前
C++ 中的类型双关、union 与类型双关:让一块内存有多个“名字”
开发语言·c++