Python中的类对象示例详解
作者:大虾昊 发布时间:2022-03-20 12:40:50
抽象特点
Python 一切皆对象,基于此概念,对 类 class 有以下特点:
类与实例的属性
类对象创建可选择定义类属性,创建实例对象时,实例属性自动执行类的__init__方法初始化
实例对象自动继承相应的类属性(如果有),但实例属性优先级更高
实例方法,类方法,静态方法的参数
实例方法是一般函数但实例方法需要传入self参数(与一般函数的区别)
类方法和静态方法是通过装饰器实现的函数,类方法需要传入cls参数,静态方法无需传入self参数或者是cls参数(但也能传入参数)
其中self参数必须指向实例对象,cls参数指向定义的类对象(self与cls是约定俗成的,原则上可以用其它名字)
方法与函数
其中方法是在对象语境下的函数,实例调用实例方法即调用方法,类调用实例方法即调用函数
具体细节
类举例
class Toy(object): # 此处此类可理解为设计一个Toy的蓝图
# 赋值定义类属性,记录所有玩具数量
count = 0
def __init__(self, name): # 用于实例初始化
self.name = name
# 类属性 +1
Toy.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 = '小敏'
@classmethod
def www(cls):
print('%s 干嘛!' % cls.name)
# cls.call() # 类方法可以调用静态方法
@staticmethod
def call():
print('喵喵~')
Cat.name = '小敏臭弟弟'
print(Cat.name)
# Cat.www() # 静态方法可以调用类方法
Cat.www()
Cat.call()
# 没有定义实例方法可以创建实例对象继承并使用其中方法
cat1 = Cat()
cat1.www()
cat1.call()
输出结果
小敏 干嘛!
喵喵~
小敏臭弟弟
小敏臭弟弟 干嘛!
喵喵~
小敏臭弟弟
祖先对象中包含的基本方法
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 中最核心的对象,定义类通常要写好类属性,实例方法,类方法,静态方法等几部份。把类和继承的类的实例比作函数中的主函数和子函数,那么类属性可认为是全局变量,实例属性可认为是局部变量;把类看成葫芦,实例方法则是方便我们照画瓢的同时,提供因地制宜的可能;类方式能够使我们更高效的使用类的功能而静态方法往往能帮助我们了解类的功能。
类 的各方法间并不是彼此毫不相干,而是有着很强的共性,具体使用时应灵活运用,不应局限在抽象的定义之中。
来源:https://blog.csdn.net/weixin_49371288/article/details/115244644
猜你喜欢
- 由于本人使用的是Android设备做自动化测试,所以以下内容均基于Android系统做出的整理一、启动app启动app需要设置Capabil
- 想要使用xpath来解析html内容, PHP自带两个对象DOMDocument,DOMXpath,其中初始化 loadHtml一般都会报很
- max找出tensor 的行或者列最大的值:找出每行的最大值:import torchoutputs=torch.FloatTensor([
- torch.Tensor.detach()的使用detach()的官方说明如下:Returns a new Tensor, detached
- #设a为字符串import timea = "2011-09-28 10:00:00"#中间过程,一般都需要将字符串转化
- 前言Node 给前端开发带来了很大的改变,促进了前端开发的自动化,我们可以简化开发工作,然后利用各种工具包生成生产环境。如运行sass sr
- MySQL目前不支持列的Default 为函数的形式,如达到你某列的默认值为当前更新日期与时间的功能,你可以使用TIMESTAMP列类型下面
- 说实在的个人对游戏并没有多大的兴趣,但唯独对暴雪的Diablo系列很有感情,去年年初开始玩Diablo3,断断续续,感觉最麻烦的是选择技能,
- 做开发总得用到数据吧,Linux作为服务器,总得有一个数据库来存储测试用的数据,所以呢,这里附上CentOS6、7安装MySQL5.7的教程
- 想用go做一个统计svn代码提交的工具,类似statsvn。今天进展到了用go解析svn log生成的xml格式的文件,在go doc上找了
- if条件分支1. if语句基本用法if boolean_value:子代码模块11)判断条件 boolean_value是if语句判断条件
- MySQL 是完全网络化的跨平台关系型数据库系统,同时是具有客户机/服务器体系结构的分布式数据库管理系统。MySQL 是完全网络化
- 今天以一个表单的自动提交,来进一步学习selenium的用法练习目标0)运用selenium启动firefox并载入指定页面(这部分可查看本
- 最近为了做Hyperledger Fabric国密改造,涉及到了golang源码的改动。特将操作过程整理如下,以供参考:golang的源码安
- 本文实例总结了Python操作redis方法。分享给大家供大家参考,具体如下:python连接方式可参考:https://www.jb51.
- 遇到一个难题,在无物理键盘情况下,通过页面软键盘在页面文本框输入汉字,不知道51js的各位大牛有没有遇到过这种需求,如果遇到过是如何解决的,
- 表单在网页中主要负责数据采集功能。一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数
- 1.直方图直方图: (1) 图像中不同像素等级出现的次数 (2) 图像中具有不同等级的像素关于总像素数目的比值。我们使用cv2.calcHi
- 本文适用场景:想用Tkinter开发界面程序并屏幕居中,但没找到相应的API。这两天玩了玩Tkinter,感觉不错,就是屏幕居中这个问题在网
- 首先说明本文并不是安装教程,网上有很多,这里只是自己遇到的一些问题我是以前安装的tensorflow-gpu的,但是发现现在的学术论文大部分