Python的类对象
文章目录
- 抽象特点
- 具体细节
- 总结
抽象特点
Python 一切皆 对象 object
基于此概念 类 class
实现了以下特性
- 类与实例
Instance
的属性
类对象创建时可直接在类中定义类属性与实现一些逻辑。创建实例对象时,首先,执行类中直接定义的属性与其他非方法代码,其次,执行类的
__init__
构造方法初始化,其中可定义实例属性与实现一些逻辑
实例对象自动继承类中定义的类属性,同时也会自动继承
__init__
构造方法中定义的实例属性,当两者重合发生命名空间冲突,优先级更高的实例属性会进行重写override
(如果是函数需要使参数列表与原函数一致,返回类型与原函数一致),最终成为实例对象中的该属性
- 实例方法、类方法
classmethod
和静态方法staticmethod
的参数
实例方法是与实例绑定的函数,定义实例方法需要定义
self
形参(与一般函数的形式区别)
类方法和静态方法是通过装饰器实现,类方法是需要传入
cls
参数的函数,静态方法无需传入self
参数或者是cls
参数(但也能传入参数)
其中
self
参数指向实例对象cls
参数指向定义的类对象(self
与cls
是约定俗成的,原则上可以用其它名字),因此类对象不能直接调用类中定义的实例方法,只能间接的创建实例再通过class.method(Instance)
的方式调用(此时Instance
不能省略,因为调用方法的是类对象而不是实例对象,Python 无法自动得到self
此时实例方法的参数列表就不匹配了,将无法正确执行),实例对象可以直接使用Instance.method()
的方式调用实例方法(此时 self 被自动得到隐式传入到实例方法的参数列表中),虽然有语法上的区别,但是对于Python
解释器而言两者等价
支持运算符重载
overload
(函数名相同但参数不同),可以对类的专有方法__str__
与__add__
等进行重载从而让类对象及其实例对象能够使用运算符操作
- 方法
method
与函数function
编程中方法用于类对象的语境,可以认为类对象绑定的函数就是方法,没有绑定关系就是函数
具体细节
- 类举例
class Toy(object): # 此处此类可理解为设计一个Toy的蓝图,类名通常采用大驼峰格式# 赋值定义类属性,记录所有玩具数量count = 0def __init__(self, name): # 用于实例初始化self.name = name# 类属性 +1Toy.count += 1@classmethod # 此装饰器表示是类方法,类方法无需创建实例对象即可调用,最为灵活def show_toy_count(cls):print('玩具对象的数量 %d' % cls.count, cls)@staticmethod # 此装饰器表示是静态方法,静态方法本质上是封装在类对象内的的函数,常用于测试def hi():print('Hello!')# 实例方法def beybey(self):print('Sad!', self)# 创建实例对象
toy1 = Toy('乐高')
toy1.hand = 2
toy2 = Toy('泰迪熊')
toy3 = Toy('哥斯拉')
print(toy1.name, toy2.name, toy3.name)# 点语法调用类方法与静态方法,如:类名.方法
Toy.show_toy_count()
Toy.hi()
# 实例对象调用类方法时,与类对象调用类方法无异,但实际上调用仍通过实例对象继承的类对象
toy1.show_toy_count()
print(toy1.hand)
# 实例对象调用静态方法时,与类对象调用静态方法无异,但实际上调用仍通过实例对象继承的类对象
toy2.hi()
# 实例对象调用实例方法,Python的解释器内部,当我们调用toy3.beybey()时,实际上Python解释成Toy.beybey(toy3)
toy3.beybey()
# Toy.beybey() # 错误语法,self必须指向实例对象,此处实例方法指向类对象而不是实例对象,因此需要写上实例对象不能省略
Toy.beybey(toy3)
# 类与其实例的类型和内存地址
print(type(Toy), id(Toy), type(toy3), id(toy3))
- 输出结果
乐高 泰迪熊 哥斯拉
玩具对象的数量 3 <class '__main__.Toy'>
Hello!
玩具对象的数量 3 <class '__main__.Toy'>
2
Hello!
Sad! <__main__.Toy object at 0x000001FD9F794D60>
Sad! <__main__.Toy object at 0x000001FD9F794D60>
<class 'type'> 2188806599664 <class '__main__.Toy'> 2188813880672
- 类方法与静态方法举例
class Cat: # 或者class Cat()不写父对象形式定义类对象,会默认继承祖先object对象name = '小敏'@classmethoddef www(cls):print('%s 干嘛!' % cls.name)# cls.call() # 类方法可以调用静态方法@staticmethoddef call():print('喵喵~')Cat.name = '小敏臭弟弟'print(Cat.name)# Cat.www() # 静态方法可以调用类方法Cat.www()
Cat.call()
# 没有定义实例方法可以创建实例对象继承并使用类其中定义的方法
cat1 = Cat()
cat1.www()
cat1.call()
# 类属性可以等于另一个类
cat2 = Cat()
cat2.name = 'geigei'
Cat.name = Toy
cat1.other = toy1
cat2.other = toy2
- 输出结果
小敏 干嘛!
喵喵~
小敏臭弟弟
小敏臭弟弟 干嘛!
喵喵~
小敏臭弟弟
- 祖先对象中包含的基本方法
print(dir(object))['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
总结
类 class
是 Python 中最核心的对象 object
,定义类通常要写好类属性,实例方法,类方法,静态方法等几部份。把类和继承的类的实例比作函数中的主函数和子函数,那么 类属性 可认为是全局变量,实例属性 可认为是局部变量;把类看成葫芦,实例方法 则是方便我们照画瓢的同时,提供因地制宜的可能;类方式 能够使我们更高效的使用类的功能而 静态方法 往往能帮助我们了解类的功能
类的各方法间并不是彼此毫不相干,而是有着很强的共性,设计的目的是为了提升编程效率,因此具体使用时应灵活运用,不必局限在抽象的定义之中
Python的类对象相关推荐
- Python: 自定义类对象序列化为Json串
之前已经实现了Python: Json串反序列化为自定义类对象,这次来实现了Json的序列化. 测试代码和结果如下: import Json.JsonToolclass Score:math = 0c ...
- python保存类对象_python 存储类对象吗
Python源码读后小结 Python 笔记 前言(还是叫杂记吧) 在python中一切皆对象, python中的对象体系大致包含了"类型对象", "Mapping对象( ...
- Python将类对象转换为json
def demo():# 1.定义一个Student类class Student(object):# 初始化中给对象属性赋值def __init__(self, name, age, phone):s ...
- python释放类对象_Python 基本功: 10. 面对对象-类 Class
虽然 Python 可以写函数式编程,但是本质上是一门面对对象编程语言 (object-oriented programming language),简称 oop.面对对象编程是把代码包装成一个对象 ...
- 包含对象的json格式_如何把JSON数据格式转换为Python的类对象?
JOSN字符串转换为自定义类实例对象 有时候我们有这种需求就是把一个JSON字符串转换为一个具体的Python类的实例,比如你接收到这样一个JSON字符串如下: {"Name": ...
- [转载] 包含对象的json格式_如何把JSON数据格式转换为Python的类对象?
参考链接: python json 12: numpy转换为json数据 JOSN字符串转换为自定义类实例对象 有时候我们有这种需求就是把一个JSON字符串转换为一个具体的Python类的实例,比如你 ...
- python保存类对象到文件_python存储对象到文件
1.pickle包 (1).将内存中的对象转换成为文本流: import pickle # define class class Bird(object): have_feather = True w ...
- python类的定义和创建_Python类对象的创建和使用
通过前面章节的学习,我们已经学会如何定义一个类,但要想使用它,必须创建该类的对象. 创建类对象的过程,又称为类的实例化. 类名(参数) 定义类时,如果没有手动添加 __init__() 构造方法,又或 ...
- python的类和对象_Python类与对象实验
一.任务描述 本实验任务主要对Python类与对象进行一些基本操作,通过完成本实验任务,要求学生熟练掌握Python类与对象的关系,并对Python类与对象的基本操作进行整理并填写工作任务报告. 二. ...
最新文章
- mysql 视图 临时表模式
- win10 搭载文件服务器,win10远程文件服务器
- centos6,7的启动流程
- oracle的脚本语言是什么意思,Oracle中的sql脚本语言中的循环语句介绍
- 启动后显示不了数据_90后都买不起房?统计数据显示:90后成了城市租房主力!...
- 监测http端口是否存活
- 聚合函数的计算机控件,sql – 当我们在联接中使用聚合函数时如何使用Group By子句?...
- 详解BSCI实验二、配置ospf验证,汇总,虚链路
- mac苹果电脑安装非app store软件无法安装的解决办法
- java车牌号识别EasyPR_EasyPR
- KinectSDK + Unity3D学习总结
- SiliconLab zigbee host移植到IPQ 807X平台
- audio或video标签的autoplay属性的说明
- 8.绘制统计图形——直方图
- VMware虚拟机如何联网详解
- 2022年度浦东新区科技发展基金社会领域数字化转型专项立项公示
- 计算机名加用户名盘符,硬盘该如何修改盘符名D/E/F/?
- 了解公司企业:Noto IT Solutions
- mysql外键约束怎么写_mysql外键约束怎么写
- 【代码随想录】刷题笔记Day5