python面向对象(上)

news2025/8/10 3:28:19

python面向对象上

  • 命名规则
  • 对象的创建
    • 创建类对象
    • 创建实例对象
    • 修改增加类属性
  • 构造方法
    • 构造实例方法
      • 不带变量
      • 带变量
      • 构造方法小例子
    • 构造类方法
    • 构造静态方法
  • 运算符的重载
    • 比较运算符重载
    • 字符串重载
    • 索引或切片重载
    • 索引或切片重载
    • 检查成员重载
    • 重载小结
  • 持续更新中~~~~~~~~

先上个例子:

class Student: # 类名,同时创建同名的类对象和变量,类对象只能有一个
    school='yyds' #类属性
    def show(self,id,name,age,school): # 第一个参数必须是self,指的是当前类的实例
        self.id=id# name,id,age是实例属性
        self.name=name
        self.age=age
        self.school=school
        print(self.id,self.name,self.age)# 创建一个实例

命名规则

创建类的时候命名有以下几个规则:
1:用class关键字来定义类,命名格式如上
2:类名的首字母应大写,如上的Student(不是强制的,但是是一般的命名规则,这样命名不会出错)
3:方法命名的时候如果有多个单词第一个单词首字母不用大写,其余的单词首字母大写
4:我们再给属性或方法命名的时候通过下划线来表示变量的类别:_foo(左边有一个下划线),表示只允许本身及其子类应用;__foo(左边有两个下划线,表示是私有类型),只允许这个类本身访问; __ foo __(左右各有两个下划线,表示python的内置函数)
一个类主要由以下六个要素组成:
类对象、实例对象、类属性、实例属性、类方法、实例方法。

对象的创建

创建类对象

以上已经说明,用(class+类名)创建,创建类名的同时还自动创建类对象和量,名称就是类名称,这里要注意的是类对象只能有一个。

创建实例对象

实例对象通过调用类对象来创建,如下所示:

s1=Student() #创建一个实例对象,继承其所有的实例方法

通过以上的代码,我们创建了一个实例对象,这里实例对象会继承所有的实例方法,实例属性等
如果类中有相同的类属性和实例属性,那么通过实例对象只能访问实例属性,如下所示的代码:

class Student:
    school='yyds'
    def say(self,school):
        self.school=school
s1=Student()
s1.say('ohhh')
print(s1.school,Student.school)

以上的话我们运行可以发现,用s1得到的是ohhh,用Student得到是yyds,这里我们可以理解为局部变量的优先级大于全局变量,两者尽量不要有重名

修改增加类属性

此外,我们还可以修改或增加类对象与实例对象的属性,如下所示的代码:

class Student:
    school='yyds'
    def say(self,school):
        self.school=school
s1=Student()
s1.say('ohhh')
s1.age=11
s1.name='小明'
Student.age=111
print(s1.age,s1.name,Student.age)

我们在这里对s1增加了age与name属性,对Student增加了age属性,输出的与增加的相同

构造方法

构造实例方法

要注意的一点是实例方法的第一个变量永远是self,其后面跟着定义的是其余的自定义的变量。
我们这里先说一种特殊的方法定义:对于__init__ 的重写,python在创建对象的时候默认是存在init的,但是如果我们想对初始化重新写的话,就可以加入一个对于以上__init__的重写,也可以带变量,但是在调用创建的时候也要带变量。
如下图代码所示:

不带变量

class Student:
    school='yyds'
    def __init__(self):
        self.name='111'
        self.age=16
        self.school='ohhh'
s1=Student()
print(s1.name,s1.age,s1.school)

这个是不带变量的,下面是输出:
在这里插入图片描述

带变量

class Student1:
    school='yyds'
    def __init__(self,name,age,school):
        self.name=name
        self.age=age
        self.school=school
s2=Student1('yyds',16,'ohhh')
print(s2.school,s2.name,s2.age)

这是带变量的,下面是输出结果
在这里插入图片描述
当然也可以构造很多其他的方法,构造的形式和以上类似,但要注意的一点是第一个变量永远是 self
我们再来一个实例方法的例子

构造方法小例子

class Student:
    student_num=0
    def add(self,name):
        print('增加了一名新同学,名字叫:%s'% name)
        Student.student_num+=1
s1=Student()
s1.add('yyds')
print(s1.student_num)
s2=Student()
s2.add('ohhh')
print(s2.student_num)

我们可以看出来在一个代码中,每创建一个类属性,类变量不会清零,而是递加的

构造类方法

很简单,就是在方法的上面加上一个@classmethod,但是第一个变量是cls,类变量可以调用,通过cls可以访问相关的类属性,但是不能访问实例属性,如下面的代码所示:

class Student:
    student_num=0
    def add(self,name):
        print('增加了一名新同学,名字叫:%s'% name)
        Student.student_num+=1
    @classmethod
    def sub(cls,name):# 这里的cls只能访问类属性,不能访问实例属性
        print('转走了一个学生,名字为:%s'% name)
        cls.student_num-=1
s1=Student()
s1.add('yyds')
print(s1.student_num)
s2=Student()
s2.add('ohhh')
print(s2.student_num)
Student.sub('ohhh')
print(Student.student_num)

构造静态方法

在程序的前面加一个@staticmethod
静态方法可以访问类属性,但不可以访问实例属性

class Student():
    num=0
    def __init__(self,myName):
        Student.num+=1
        self.name=myName
    @staticmethod
    def count():
        print('学生个数:%d'%Student.num)
Student.count()
s1=Student('小千')
s1.count()
s2=Student('小峰')
s1.count()

下面是输出结果:
在这里插入图片描述

运算符的重载

比较运算符重载

class MyComplex:
    def __init__(self,r=0,i=0): # 构造方法
        self.r=r
        self.i=i
    def __add__(self, other): # 重载乘运算
        return MyComplex(self.r+other.r,self.i+other.i)
    def __sub__(self, other): # 重载减运算
        return MyComplex(self.r-other.r,self.i-other.i)
    def __mul__(self, other): # 重载乘运算
        return MyComplex(self.r*self.r,other.i*other.i)
    def __truediv__(self, other): # 重载除运算
        return MyComplex(
            (self.r*other.r+self.i*other.i)/(other.r**2+other.i**2),
            (self.i*other.r-self.r*other.i)/(other.r**2+other.i**2)
        )
    def show(self): # 设置输出的格式
        if self.i<0:
            print('(',self.r,self.i,'j',')',sep='')
        else:
            print('(',self.r,'+',self.i,'j',')',sep='')
c1=MyComplex(6,-8)
c2=MyComplex(1,-1)
(c1+c2).show()
(c1-c2).show()
(c1*c2).show()
(c1/c2).show()

下面是输出:
在这里插入图片描述

字符串重载

当对象作为str()或者print()的参数时,该对象会调用重载的__str__ 方法,所以我们在类中重载了str之后,该类加减的时候会直接返回我们定义的输出形式

class MyComplex:
    def __init__(self,r=0,i=0):# 构造方法
        self.r=r
        self.i=i
    def __str__(self):
        if self.i<0:
            return '('+str(self.r)+str(self.i)+'j)'
        else :
            return '('+str(self.r)+'+'+str(self.i)+'j)'
c1=MyComplex(6,-8)
c2=MyComplex(1,2)
print(c1,str(c2))

索引或切片重载

当对实例对象执行索引、分片或迭代时,该对象会调用__getitem__()方法

class Data:# 定义一个数据类
    def __init__(self,list):
        self.data=list[::-1]
    def __getitem__(self, item): # 重载索引与分片
        return self.data[item]
data=Data([1,2,3,4,5])
print(data[2])
print(data[1:])
for i in data:
    print(i,end=' ')

索引或切片重载

用setitem来是实现对对象的修改

class Data:# 定义一个数据类
    def __init__(self,list):
        self.data=list[::-1]
    def __setitem__(self, key,value): # 重载索引与分片
        self.data[key]=value
data=Data([1,2,3,4,5])
print(data.data)
data.data[1]='千千万万'
data.data[2:]='you are a little cow horse'
print(data.data)

检查成员重载

class Data:# 定义一个数据类
    def __init__(self,list):
        self.data=list[::-1]
    def __contains__(self, item): # 重载索引与分片
        return item in self.data
data=Data([1,2,3,4,5])
print(1 in data.data)

重载小结

总结一下:重载就是先创建一个类,然后我们在里面定义重载的符号,我们在要建一个实例对象来表达我们要计算的数,然后实例对象之间的计算就是来根据重载符来计算的

持续更新中~~~~~~~~

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

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

相关文章

莫名其妙: conda使用过程各种错误及总结

conda真的很烦呢&#xff0c;有啥好用的&#xff0c;要不是准备学习一下虚拟环境&#xff0c;我才不折腾呢&#xff0c;浪费好多时间&#xff0c;(&#xff1b;′⌒) 不要挂代理&#xff0c;我怎么知道为什么&#xff0c;和pip一样&#xff0c;不过后来不知道为什么pip很流畅c…

知识蒸馏(Knowledge Distillation)

0.Introduction 知识蒸馏&#xff08;Knowledge Distillation&#xff0c;简记为 KD&#xff09;是一种经典的模型压缩方法&#xff0c;核心思想是通过引导轻量化的学生模型“模仿”性能更好、结构更复杂的教师模型&#xff08;或多模型的 ensemble&#xff09;&#xff0c;在…

第3章:中文本文向量化——代码详解

1.单条语句的向量化 根据不同的向量化&#xff0c;对“中华女子学院&#xff1a;本科层次仅1专业招男生”这句话进行向量化 1.1 One-hot方法 # one-hot代码 import jieba import os import numpy as npstopwords open(./data/哈工大停用词表.txt).read().split("\n&qu…

物联网安全年报暴露情况分析

暴露情况分析 在去年研究的基础上&#xff0c;我们今年对 UPnP 协议的暴露情况进行持续关注。如无特殊说明&#xff0c;本章中的 统计数据基于全球单轮次的测绘&#xff08;2019 年 10 月&#xff09;。本节我们将对 SSDP 与 SOAP服务的暴露情况进行 分析&#xff0c;4.4.2 节…

图床项目架构与设计

分布式文件服务系统架构与设计 该项目利用FastDFS分布式文件系统以及集群等技术提供统一的接口对外提供文件存储和访问服务&#xff0c;使用户能够通过网络访问服务端的文件资源&#xff0c;满足海量数据存储的需求 架构 项目采用B/S模型&#xff0c;服务端与浏览器进行交互&a…

论文阅读-Detecting and Recovering Sequential DeepFake Manipulation(SeqFakeFormer)

一、论文信息 论文名称&#xff1a;Detecting and Recovering Sequential DeepFake Manipulation&#xff08;篡改序列检测还原&#xff09; 论文链接: https://arxiv.org/pdf/2207.02204.pdf 项目主页: https://rshaojimmy.github.io/Projects/SeqDeepFake GitHub: https:…

Linux 最近学习总结

Linux 最近学习总结一.基础命令一.基础命令 基础命令就像是锤子、螺丝刀、锯等木匠常用到的工具&#xff0c;也是我们每天都会用到的命令 1.ls 列出当前所在目录的内容 2.ls 文件夹名 列出其他文件夹内容 3.ls ~ 其中~代表home目录 4.ls ~/Desktop/Java电子书/*.pdf 使用…

Eigen Segmentation fault (core dumped)

不会GDB吃大亏问题描述&#xff1a;解法&#xff1a;写在前面的话&#xff1a;我是PCL新手。也是Cmake新手。Eigen有点折腾人。 问题描述&#xff1a; 在调用PCL库实现一些有趣的功能&#xff0c;考虑到考虑到兼容不同平台&#xff0c;现状如下&#xff1a; VS2015&#xff1…

JavaScript基本语法详解

目录 一、JavaScript数据类型 二、算术运算符 1&#xff1a;分支结构 &#xff08;1&#xff09;if语句 &#xff08;2&#xff09;if...else语句 &#xff08;3&#xff09;if..else if语句 2&#xff1a;循环结构 &#xff08;1&#xff09;for循环 &#xff08;2&a…

ipv6地址概述——了解ipv6地址

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。个人爱好: 编程&#xff0c;打篮球&#xff0c;计算机知识个人名言&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石…

[ Linux ] 进程间通信之共享内存

在上篇博文我们了解了通过管道完成进程间通信&#xff0c;我们了解匿名管道和命名管道&#xff0c;并且通过编码模拟实现使用了匿名管道和命名管道。我们知道要让进程间完成通信必须让这两个进程首先看到同一份资源&#xff0c;因此给予这个前提&#xff0c;本篇博文我们了解另…

【Linux】自动化构建工具-make/Makefile第一个小程序

大家好我是沐曦希&#x1f495; 文章目录一.项目自动化构建工具-make/Makefile1.背景2. 举例3. 原理4. 总结5. 项目清理6. 习题习题一习题二二.第一个小程序&#xff0d;进度条1.行缓冲区2.倒计时3.进度条一.项目自动化构建工具-make/Makefile 1.背景 会不会写makefile&#x…

使用 elasticdump 跨版本迁移 ES 数据

1、elasticdump 用途介绍 elasticdump 是一个在 Github 开源的 Elasticsearch 的数据迁移工具&#xff0c;项目 Github 地址&#xff1a;[传送门](Github 地址&#xff1a;https://github.com/elasticsearch-dump/elasticsearch-dump) elasticdump 支持跨版本导出和导入数据&am…

【java进阶07:常用类】String类、包装类、日期类Date、数字类、随机数、枚举类型

String类 String类型的字符串存储原理 /*关于java JDK中内置的一个类&#xff1a;java.util.String1、String表示字符串类型&#xff0c;属于引用数据类型&#xff0c;不属于基本数据类型。2、在java中随便使用双引号括起来的都是String对象&#xff0c;例如&#xff1a;"…

零基础上手unity VR开发【配置PC端项目的实时调试】

&#x1f4cc;个人主页&#xff1a;个人主页 ​&#x1f9c0; 推荐专栏&#xff1a;Unity VR 开发成神之路 --【着重解决VR项目开发难&#xff0c;国内资料匮乏的问题。从零入门&#xff0c;一步一个脚印&#xff0c;带你搞定VR开发! &#x1f63b;&#x1f63b;】 &#x1f4d…

聊一聊如何截获 C# 程序产生的日志

一&#xff1a;背景 1.讲故事 前段时间分析了一个dump&#xff0c;一顿操作之后&#xff0c;我希望用外力来阻止程序内部对某一个com组件的调用&#xff0c;对&#xff0c;就是想借助外力实现&#xff0c;如果用 windbg 的话&#xff0c;可以说非常轻松&#xff0c;但现实情况…

当下互联网行业趋势,你顶得住吗?

持续三年的疫情导致经济形式大不如前&#xff0c;特别是互联网行业&#xff0c;不少员工面临着失业的压力&#xff0c;在如此恶劣的大环境下&#xff0c;计算机行业的我们应该如何生存&#xff1f;有一个很好的办法就是 —— 考证&#xff01;&#xff01;&#xff01;如今越来…

多线程与并发 - 常见的几种锁的实现方式

1、悲观锁 正如其名&#xff0c;它是指对数据修改时持保守态度&#xff0c;认为其他人也会修改数据。因此在操作数据时&#xff0c;会把数据锁住&#xff0c;直到操作完成。悲观锁大多数情况下依靠数据库的锁机制实现&#xff0c;以保证操作最大程度的独占性。如果加锁的时间过…

深度学习入门(6)误差反向传播基础---计算图与链式法则

在我的第三篇博文《深度学习入门&#xff08;3&#xff09;神经网络参数梯度的计算方式》中详细介绍了通过微分方式计算神经网络权重参数的梯度。但是数值微分的方式计算梯度效率较低。后续博文会介绍另外一种更加高效的梯度计算方式---误差的反向传播。 这篇文章介绍的是误差…

CorelDRAW2023最新版矢量设计软件

CorelDRAW2023最新版是我比较用的比较好的一款软件&#xff0c;因为其作为一款优秀的矢量设计软件&#xff0c;兼具功能和性能&#xff0c;它是由Corel公司出品的矢量设计工具&#xff0c;被广泛应用于排版印刷、矢量图形编辑、网页设计等行业。CDR软件的优势在于&#xff1a;易…