Python基础(十八): 类和对象以及它们的属性
一、类
- 最简单的经典类结构
class 类名:pass
复制代码
1、定义一个类
class Money:pass
复制代码
类名规范: 驼峰命名法, 并且首字母大写
2、实例化一个对象
- 创建一个对象, 最简单的方式就是类名后加上小括号
one = Money() # 创建一个Money类的实例化对象
复制代码
- 可以打印查看类和对象
print(Money)
print(one)# 打印结果:
<class '__main__.Money'>
<__main__.Money object at 0x101dba588>
复制代码
3、关于类名
- 上面的Money类
class Money:pass
复制代码
其中的
Money
, 即表示类名, 又是一个变量我们先通过
__name__
, 可以查看Money
的类名
print(Money.__name__) # 打印结果: Money
复制代码
- 定义一个新的变量, 接受Money的值
abc = Money
print(abc)
# 打印结果: <class '__main__.Money'>
复制代码
- 使用abc创建一个对象
one = abc()
print(one)
# 打印结果: <__main__.Money object at 0x103d1f6d8>
复制代码
- 可以给Money重新赋值
Money = 666
print(Money) # 打印结果: 666
复制代码
结论: 在定义类的时候, 在内存中分配了一段空间, 用来存放类的信息, 同时又创建了一个与类同名的变量, 这个变量指向这个类
例如: 创建Money类时, 在内存中分配空间存放Money类的信息, 同时创建一个变量Money, 并且指向Money类, 我们可以创建变量abc, 来指向Money类。 然后直接使用abc可以创建Money类的实例化对象, 同时也可以将变量Money重新赋值
二、对象
实例化对象: 在内存中分配一段空间存放对象信息
我们可以使用一个变量指向这个对象, 通过变量使用对象
所有的对象都有一个属性
__calss__
, 可以查看当前对象属于哪一个类
class Money: # 定义类pass
one = Money() # 创建对象, 并使用变量one引用这个对象
print(one.__class__) # 打印: <class '__main__.Money'>
复制代码
1、添加属性
- 定义一个
Person
类, 并实例化对象p
class Person:pass
p = Person()
复制代码
- 可以直接使用
对象.属性 = 值
, 给对象添加属性
p.name = "zhangsan"
p.age = 18
p.height = 1.78
复制代码
2、查询属性
- 可以使用
对象.__dict__
查看对象所有的属性
result = p.__dict__
print(result)
# 打印结果: {'name': 'zhangsan', 'age': 18, 'height': 1.78}
复制代码
- 可以使用
对象.属性
, 查看属性值
print(p.name) # 打印: zhangsan
print(p.age) # 打印: 18
print(p.height) # 打印: 1.78
复制代码
- 如果查看对象不存在的属性, 那么会直接报错
print(p.sex)
# 报错: AttributeError: 'Person' object has no attribute 'sex'
复制代码
3、修改属性
- 可以使用
对象.属性 = 值
, 来修改属性
p.age = 20
复制代码
4、删除属性
- 使用
del
语句, 可以删除对象已有属性
print(p.__dict__)
del p.name
print(p.__dict__)# 打印结果:
{'name': 'zhangsan', 'age': 20, 'height': 1.78}
{'age': 20, 'height': 1.78}
复制代码
- 删除所有属性
print(p.__dict__)
del p.__dict__
print(p.__dict__)# 打印结果:
{'name': 'zhangsan', 'age': 18, 'height': 1.78}
{}
复制代码
三、类的属性
1、添加属性
- a. 使用
类.属性 = 值
, 可以给类添加属性
class Money:pass
Money.count = 1
复制代码
- b. 在类的实现中添加属性
class Money:count = 1
复制代码
2、查看属性
- 使用
类.属性
, 可以获取属性值
print(Money.count) # 打印: 1
复制代码
- 可以使用
类.__dict__
查看类的所有属性
print(Money.__dict__)# 打印结果:
{'__module__': '__main__', '__dict__': <attribute '__dict__' of 'Money' objects>, '__weakref__': <attribute '__weakref__' of 'Money' objects>, '__doc__': None, 'count': 1}
复制代码
'count': 1就是新添加的类属性, 至于其他属性都是类创建时系统添加的类属性
- 如果查看不存在的属性, 会报错
print(Money.number)
# 报错: AttributeError: type object 'Money' has no attribute 'number'
复制代码
3、使用对象访问类中的属性
- 定义
Money
类, 并添加count
和num
属性
class Money: count = 1num = 666
复制代码
- 实例化一个对象
one = Money()
复制代码
- 通过
对象.类属性
, 访问类中的count
和num
属性
print(one.count) # 打印: 1
print(one.num) # 打印: 666
复制代码
当访问对象的某个属性时
- 如果对象本身拥有这个属性, 会直接使用
- 当对象本身没有这个属性时, 就会根据自身的__class__属性, 找到对应的类, 然后在类中查找属性
- 注意: 对象的__class__属性值是可以更改的, 如果__class__指向了其他的类, 那么就会在更改后的类中查找属性
4、修改属性
- 通过
类.属性
, 修改类的属性
class Money:count = 1num = 666Money.count = 10print(Money.count) # 打印结果: 10
复制代码
- 通过
对象.类属性
, 修改属性时, 只是给自己本身添加一个属性, 而不是修改类属性
class Money:count = 1num = 666one = Money() # 实例化对象 one
one.count = 10 # 给one添加属性count, 并赋值10
print(one.count) # 打印one的属性count的值two = Money() # 实例化对象 two
print(two.count) # 打印two的count属性
print(Money.count) # 打印类Money的类属性count# 打印结果
10 # one添加count属性的值
1 # two没有count属性, 查找Money中的count属性
1 # 打印类Money中的属性count
复制代码
- 类属性被对象共享, 当类属性的值改变时, 对象访问的类属性的值也会改变
class Money:count = 1one = Money()
two = Money()
print(one.count) # 打印: 1
print(two.count) # 打印: 1Money.count = 2 # 修改类属性为2print(one.count) # 打印: 2
print(two.count) # 打印: 2
复制代码
5、删除属性
- 使用
del 类.类属性
, 可以删除类的属性
del Money.count
复制代码
无法通过
del 对象.类属性
, 删除类的属性, del语句只能删除直系属性
- 类属性删除前, 实例化对象是可以访问该类属性的, 如果删除了类属性, 对象就无法再访问该类属性
class Money:count = 1num = 666one = Money() print(one.count) # 删除前通过对象, 打印: 1print(Money.count) # 删除前通过类, 打印: 1del Money.count # 删除类属性 countprint(one.count) # 报错: AttributeError: 'Money' object has no attribute 'count'
复制代码
不管是类, 还是对象, 添加的属性都是放在了
__dict__
中, 对象可以通过修改__dict__
修改属性, 而类需要一些其他的方法修改
四、限制对象添加属性
- 由于Python中的对象可以添加任何属性, 所以就可能导致同一个类创建的对象, 拥有不同的属性, 这可能给开发带来一定的麻烦
- 所以我们在定义类的时候, 就需要限制: 该类的对象只能添加某一些属性
可以使用__slots__
限制对象添加哪一些属性
- 定义一个
Person
类, 指定__slots__
的值
class Person:__slots__ = ["age", "name"]
复制代码
- 创建一个
Person
类的对象
p = Person()
复制代码
- 给
p
添加几个属性, 并运行程序
p.age = 10
p.name = "zhangsan"
p.height = 1.78 # 报错: AttributeError: 'Person' object has no attribute 'height'
复制代码
- 可以发现,
p
在添加age
和name
时没有问题, 但是在添加height
时有问题 - 这说明在类的定义中, 如果指定了
__slots__
的值, 那么实例化对象只能添加__slots__
中的属性, 而不能添加其他属性
Python基础(十八): 类和对象以及它们的属性相关推荐
- Python基础之初识类和对象
我们在前面学习了解了面向过程编程,接下来我们一起来学习一下面向对象编程.其实不管是面向过程,还是面向对 象,说白了就是一种编程方式而已.既然是面向对象编程,顾名思义,此编程方式的落地需要使用 &quo ...
- python用来初始化对象属性的是_猪行天下之Python基础——8.1 类与对象
内容简述: 1.面相对象的理解 2.类与对象 3.继承 4.组合 5.对象相关的内置函数 1.面相对象的理解 考虑到部分读者可能没有接触过面向对象编程,所以先介绍下面向对象的一些特征,形成一个面向对象 ...
- python基础教程:类和对象
Python的类(class)是抽象的概念,是指一类实例对象的集合,该实例具有相同的属性和方法,而对象(object)是类的具体的实例. 类的定义语法如下所示,最重要的两个部分是属性和方法: clas ...
- python四十二:类和对象
类有数据属性和函数属性, 但对象只有数据属性. def funName(args):'函数文档字符串'函数体class 类名:'类的文档字符串'类体创建一个类class foo:pass用类foo实例 ...
- Python基础(八)--迭代,生成器,装饰器与元类
目录 Python基础(八)--迭代,生成器,装饰器与元类 1 迭代 1.1 可迭代对象与迭代器 1.2 自定义迭代类型 1.3 迭代合体 2 生成器 2.1 什么是生成器 2.2 生成器表达式 2. ...
- Python基础十五:面向对象编程四:高级特性
Python基础十五:面向对象编程四:高级特性 Python基础系列内容为学习廖雪峰老师Python3教程的记录,廖雪峰老师官网地址:廖雪峰Python3教程 Author:yooongchun Em ...
- python如何对一个属性或方法进行封装_python 类、对象、方法、属性
在python中,一个对象的特征也称为属性(attribute).它所具有的行为也称为方法(method) 结论:对象=属性+方法 在python中,把具有相同属性和方法的对象归为一个类(class) ...
- JavaScript学习(四十八)—原型对象的增删改查
JavaScript学习(四十八)-原型对象的增删改查 一.构造方法与原型对象的图解 二.型对象的增删改查 (一).什么是原型 每个函数都会有一个属性--prototype属性,这个属性都会有一个对象 ...
- Python学习笔记 (类与对象)
Python学习笔记 (类与对象) 1.类与对象 面向对象编程语言类: 一个模板, (人类)-是一个抽象的, 没有实体的对象: (eg: 张三, 李四) 属性: (表示这类东西的特征, 眼睛, 嘴巴, ...
最新文章
- python打包成exe_Python打包文件为exe,PyInstaller应用
- mybatis学习6复杂查询之一对多的处理
- Linux shell关系运算
- Linux5观察doc目录并截屏,linux截屏命令
- java 调用jira_java调用jira接口
- sql crud_使用适用于SQL Server的Python SQL库执行CRUD操作
- python文件夹,文件监听工具(pyinotify,watchdog)
- 理论物理极础11:电力和磁力
- pclint如何不检查头文件_衡水中学优秀班主任:考试时如何检查,才能不丢分?3个技巧...
- python学习笔记(52周存钱挑战)
- 微信wifi服务器地址,微信连WIFI服务器时钟不同步
- 《Linux操作系统-基础笔记》第6章 编译调试工具(GCC、GDB)
- 克隆Linux虚拟机
- 70后.net老猿,尚能饭否?
- 小程序如何本地去水印,基于很多小白写的教程
- 浏览器翻译功能在哪里,如何使用浏览器翻译网页
- 股票模拟交易日志(一)
- 论文研读 —— 6. ImageNet Classification with Deep Convolutional Neural Networks (1/3)
- 苹果Mac电脑清理垃圾软件卸载工具CleanMyMac X
- 转载:ubuntu教程
热门文章
- 心语收集11:我们可以经得起心脏的千疮百孔,可以接受感情的支离破碎,却不愿喝下忘情水,忘记那曾经爱过的人。...
- 都是自私惹的祸? 论蹭网再触道德底线
- 灰度实战(三):Apollo配置中心(3)
- 智能一代云平台(二十二):多租户方案比较Hibernate、EclipseLink、Mybatis+Mycat
- 训练史上最佳GAN用了512块TPU,一作自述:这不是算法进步,是算力进步
- 这位勇士,你别去读博了:搞机器学习要PhD何用?
- 尴尬……无人车美国赌城上路不到一小时就撞了
- 企业生产环境数据库备份锁表问题
- 谨慎设计方法签名(40)
- Adobe正式在中国市场推出Creative Cloud创意应用软件