python中类跟实例详解

主要分享一下自己在学习python中关于类和实例的基本概念以及用法,因为在写自动化测试用例的时候会使用类跟方法进行封装,使代码更加的简洁干净,以下是自己的一些学习心得

1.类跟实例的基础概念

   类:是抽象的模板,比如动物类

   定义类的语法:class 后面紧接着是类名,即Animals,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的,通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。object继承的类也可以不写

#写法1
class Animals(object):pass
#写法2
class Animals1():pass

 实例:是根据类创建出来的一个个具体的对象,比如从动物类创建的“狮子” 

实例的语法:通过类型+()实现

#第一步先定义类
class Animals():pass
#第二步实例化一个对象dog
dog=Animals()
#可以给实例绑定属行,比如dog会叫汪汪汪
dog.say='汪汪汪'
print(dog.say)   #汪汪汪
2.类变量和实例变量 

   类变量:就是该类所有实例共享的属性和方法,也叫类属性,所有由此类实例化的对象都有此属性,并且不能修改,比如定义一个动物类,他们都属于大自然,不管实例化成的狮子,老虎。兔子他们都有一个共同的属性都属于大自然,类属性的一个常见用途是存储与类相关的常量或共享的状态信息。例如,可以在类属性中存储数据库连接信息、默认配置或类的共享状态。

#共有类属性
class Animals():from='大自然'pass
#实例化一个dog
dog=Animals()
print(dog.from)    #大自然
#实例化一个cat
cat=Animals()
print(cat.from)    #大自然

拓展: 针对类可以定义一些私有属性,两个下划线开头的属性是私有的(private)。其他为公共的(public),类内部可以直接访问私有属性,类的外部不能直接访问私有属性,类外部可以通过”_类名__私有属性名“ 访问私有属性

#定义一个动物类
class Animals():from_1='大自然'   #类属性,不管多少个实例,这个不会变化__owner='chy'   #类的私有属性,主人是chydef __init__(self,say):self.say=say   #实例属性,不同实例有不同的值self.owner=self.__owner  #类的内部直接调用类的私有属性
#实例化一个dog
dog=Animals('汪汪汪')
print(dog.from_1)
print(dog.say)
print(dog.owner)
print(Animals._Animals__owner)  #类的外部调用私有属性(类名._类名__私有属性)

 

实例变量:每个实例独有的属性也叫实例属性,这种定位位实例变量,比如定义一个动物类,每个动物都有叫声,但是叫声都不同,这个是属于不同实例的独有属性,就要定义为实例属性;定义实例属性一般使用 __init__ 方法,此方法第一个参数永远是 self表示创建的实例本身,因此,在 __init__ 方法内部,就可以把各种属性绑定到 self,因为 self 就指向创建的实例本身。

#定义一个动物类
class Animals():from_1='大自然'   #类属性,不管多少个实例,这个不会变化def __init__(self,say):self.say=say   #实例属性,不同实例有不同的值
#实例化一个dog
dog=Animals('汪汪汪')
print(dog.from_1)
print(dog.say)
#实例化一个cat
cat=Animals('喵喵喵')
print(cat.from_1)
print(cat.say)

 

 拓展:针对实例属性可以定义一些私有的实例属性,这些私有属性的定义是在前面加两个下划线,私有属性可以在类中调用,如果在类外部被调用通过 ”_类名__私有属性名“ 访问私有属性

#定义一个动物类
class Animals():from_1='大自然'   #类属性,不管多少个实例,这个不会变化def __init__(self,say,age):self.say=say   #实例属性,不同实例有不同的值self.__age=age    #定义的私有实例属性def __test(self):print(self.__age)  #类的内部调用私有的实例属性
#实例化一个dog
dog=Animals('汪汪汪','18')
print(dog._Animals__age)  #类的尾部调用私有的实例属性

 

3.类属性绑定/实例属性绑定

 在定义类时,通常我们说的定义属性,其实是分为两个方面的:类属性绑定、实例属性绑定,用绑定这个词更加确切;不管是类对象还是实例对象,属性都是依托对象而存在的。我们说的属性绑定,首先需要一个可变对象,才能执行绑定操作,使用objname.attr = attr_value的方式,为对象objname绑定属性attr,属性的绑定发生在两个地方,类定义时候,运行是任意阶段
这分两种情况:

若属性attr已经存在,绑定操作会将属性名指向新的对象;

class Animals1():from_1 = '大自然'  # 类属性from_1的属性已经存在def __init__(self):self.say='汪汪汪'#实例属性已经存在Animals1.from_1 = '动物园'  # 类属性修改成一个新的属性,此时from_1的属性会指向新的对象
dog1=Animals1()
dog1.say='喵喵喵'#实例属性修改成一个新的属性
print(Animals1.from_1)  # 动物园
print(dog1.say)#喵喵喵

若不存在,则为该对象添加新的属性,后面就可以引用新增属性

class Animals2():# 没有任何的属性def __init__(self,say):self.say=say
Animals2.from_1 = '动物园1'  # 新增一个类属性
print(Animals2.from_1)  # 动物园1
dog2=Animals2('汪汪汪')
dog2.name='jim'  #新增一个实例属性
print(dog2.name)#jim
4.类属性引用/实例属性引用
    4.1 类属性的引用

      类属性的引用分为两种:数据属性,函数属性

数据属性的引用:

class Animals():from_1='动物园'
print(Animals.from_1)  #数据属性的引用

函数属性的引用:

class Animals():jiao='汪汪汪'def say():print(Animals.jiao)
Animals.say()     #函数属性的引用
    4.2 实例属性的引用

    总是先到实例对象中查找属性,再到类属性中查找属性,如果实例属性跟类属性都有的时候,优先实例属性,如果实例属性中没有的时候再去找类属性

class Animals():from_1='大自然'   #类属性中有此age='3'def __init__(self,say,from_1):self.say=sayself.from_1=from_1  #实例属性中有此
#实例化一个具体的动物狗
dog=Animals('汪汪汪','d动物园')
print(dog.from_1)   #动物园   类属性跟实例属性都有此,优先实例属性所以打印出来的是动物园
print(dog.age)  #3,只有类属性中有此,所以值输出类属性中的值

属性绑定语句总是为实例对象创建新属性,属性存在时,更新属性指向的对象,如果类属性中有某一个属性,但是实例属性中没有此属性 ,使用实例绑定一个类中的属性,此时实例中增加一个实例属性,类属性中不变。

class Animals():from_1='大自然'def __init__(self,say):self.say=say
#实例化一个动物狗
dog=Animals()
dog.from_1='动物园'   #给实例新增了一个属性
print(dog.from_1)    #动物园
print(Animals.from_1)  #大自然,不会更新类属性
5.类方法/实例方法 

       类方法:@classmethod 装饰器定义的方法,用于操作类级别的属性。它必须包含一个 cls 参数,该参数代表类本身,可以通过类名或实例调用类方法。

class Animals:from_1='大自然'@classmethod    #装饰器定义下面的方法是一个类方法def class_method(cls):print("This is a class method")print(cls.from_1)
#调用方法
Animals.class_method

   实例方法:,用于操作实例的属性。它必须包含一个 self 参数,该参数代表类的实例。通过实例调用实例方法,会自动传入实例参数。

class MyClass:def instance_method(self):print("This is an instance method")# 创建实例
obj = MyClass()# 调用实例方法
obj.instance_method()

静态方法:是使用 @staticmethod 装饰器定义的方法,它与类和实例无关。静态方法不接受特殊的第一个参数(self 或 cls),因此无法直接访问实例变量或类变量。 

class MyClass:@staticmethoddef static_method():print("This is a static method")# 调用静态方法
MyClass.static_method()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/862231.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++题解】1721. 输出个位为5或者个位为8数

问题:1721. 输出个位为5或者个位为8数 类型:简单循环 题目描述: 请从小到大输出 1∼n 中所有个位为 5 或者个位为8 的所有的整数,每行 1 个。 比如,假设 n20,那么满足条件的数输出如下: 5 8 1…

理解MySQL核心技术:外键(Foreign Key)的设计与实现

在日常开发中,数据库是必不可少的部分,而MySQL作为最流行的关系型数据库之一,广泛应用于各类项目中。为了确保数据的完整性和一致性,外键(Foreign Key)无疑是一个重要的概念。在本篇文章中,我们…

Stream Lua Nginx Module 插件一键安装

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

昇思25天学习打卡营第10天|基于MindSpore的GPT2文本摘要

学AI还能赢奖品?每天30分钟,25天打通AI任督二脉 (qq.com) 基于MindSpore的GPT2文本摘要 %%capture captured_output # 实验环境已经预装了mindspore2.2.14,如需更换mindspore版本,可更改下面mindspore的版本号 !pip uninstall m…

如何在LabVIEW中使用FPGA模块

LabVIEW FPGA模块是NI公司推出的一款强大工具,它允许用户使用LabVIEW图形化编程环境来开发FPGA(现场可编程门阵列)应用程序。与传统的HDL(硬件描述语言)编程相比,LabVIEW FPGA模块大大简化了FPGA开发的过程…

Python 语法基础二

7.常用内置函数 执行这个命令可以查看所有内置函数和内置对象(两个下划线) >>>dir(__builtins__) [__class__, __contains__, __delattr__, __delitem__, __dir__, __doc__, __eq__, __format__, __ge__, __getattribute__, __getitem__, __gt…

memcacheredis构建缓存服务器

Memcached&Redis构建缓存服务器 前言 许多Web应用都将数据保存到 RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。Memcached/redis是高性能…

通过ChatGLM的简单例子体验大模型

【图书推荐】《从零开始大模型开发与微调:基于PyTorch与ChatGLM》_《从零开始大模型开发与微调:基于pytorch与chatglm》-CSDN博客 ChatGLM基于GLM架构,针对中文问答和对话进行了优化。经过约1TB标识符的中英双语训练,辅以监督微调、反馈自助…

Redis-Bitmap位图及其常用命令详解

1.Redis概述 2.Bitmap Bitmap 是 Redis 中的一种数据结构,用于表示位图(bit array)。 它通常用于处理大规模数据集中每个元素的状态,比如用户的在线/离线状态(每个用户对应一个位,表示在线(1&a…

计算机基础(6)——编码与解码-二进制与文本

💗计算机基础系列文章💗 👉🍀计算机基础(1)——计算机的发展史🍀👉🍀计算机基础(2)——冯诺依曼体系结构🍀👉&#x1f34…

Rust 程序设计语言学习——泛型、Trait和生命周期

每一种编程语言都有高效处理重复概念的工具。在 Rust 中其工具之一就是泛型。泛型是具体类型或其他属性的抽象替代。 Trait 定义了某个特定类型拥有可能与其他类型共享的功能。可以通过 Trait 以一种抽象的方式定义共同行为。可以使用 trait bounds 指定泛型是任何拥有特定行为…

Mac excel 同时冻结首行和首列

1. 选择B2窗格 2. 选择视图 3. 选择冻结窗格 最后首行和首列的分割线加粗了就表示成功了

youlai-boot项目的学习(3) 本地redis、MinIO的安装与配置

youlai-boot项目除了使用mysql数据库、还有redis,以及OSS服务,OSS除了云OSS服务,还有自部署的MinIO服务。 前面我们已经安装好了mysql数据库,那么我们来看看本地redis、MinIO服务怎么部署 环境 mac OS, iterm2&#…

C语言力扣刷题8——环形链表——[快慢双指针, 龟兔赛跑]

力扣刷题8——环形链表——[快慢双指针, 龟兔赛跑] 一、博客声明二、题目描述三、解题思路1、思路说明 四、解题代码(附注释) 一、博客声明 找工作逃不过刷题,为了更好的督促自己学习以及理解力扣大佬们的解题思路,开辟这个系列来…

拳打开源SOTA脚踢商业闭源的LI-DiT是怎样炼成的?(商汤/MMLab/上海AI Lab)

文章地址:https://arxiv.org/pdf/2406.11831 仅基于解码器的 Transformer 的大语言模型(LLMs)与 CLIP 和 T5 系列模型相比,已经展示出卓越的文本理解能力。然而,在文本到图像扩散模型中利用当前先进的大语言模型的范例…

中霖教育怎么样?注册会计师考试难吗?

中霖教育:注册会计师(CPA)考试的难度高吗? 对于不同背景的考生来说,注册会计师考试的挑战程度不同。那些有良好基础和充裕准备时间的考生,通过考试的可能性要超过那些从零开始且准备时间有限的人。 据最近…

GPOPS-II教程(5): 月球探测器着陆最优控制问题

文章目录 问题描述GPOPS代码main functioncontinuous functionendpoint function仿真结果 最后 问题描述 参考文献:[1] Meditch J. On the problem of optimal thrust programming for a lunar soft landing[J]. IEEE Transactions on Automatic Control, 1964, 9(4…

Linux基础- 使用 Apache 服务部署静态网站

目录 零. 简介 一. linux安装Apache 二. 创建网页 三. window访问 修改了一下默认端口 到 8080 零. 简介 Apache 是世界使用排名第一的 Web 服务器软件。 它具有以下一些显著特点和优势: 开源免费:可以免费使用和修改,拥有庞大的社区支…

Web渗透:任意文件下载

任意文件下载漏洞(Arbitrary File Download Vulnerability)是一种常见的Web安全漏洞,它允许攻击者通过修改输入参数,从服务器下载任意文件,而不仅仅是预期的文件;通常这种漏洞出现在处理用户输入的地方&…

python CSSE7030

1 Introduction In this assignment, you will implement a (heavily) simplified version of the video game ”Into The Breach”. In this game players defend a set of civilian buildings from giant monsters. In order to achieve this goal, the player commands a s…