python-面向对象

news2025/7/7 17:44:49

目录

面向对象

封装

继承

重写

 重载

多态

单下划线、双下划线、头尾双下划线说明:


面向对象

  • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
  • 数据成员:类变量或者实例变量, 用于处理类及其实例对象的相关的数据。
  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
  • 局部变量:定义在方法中的变量,只作用于当前实例的类。
  • 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
  • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
  • 实例化:创建一个类的实例,类的具体对象。
  • 方法:类中定义的函数。
  • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

# 创建类  Stuent是类名 包含name和age两个属性
class Stuent:
    name=None
    age=0

# stu是Stuent类变量,也就是对象
stu=Stuent()

#通过对象引用类属性
stu.age=18
stu.name="张三"

print("stu.name ",{stu.name },"stu.age",{stu.age})

成员方法

类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。

  • self 代表类的实例,self 在定义类的方法时是必须有的,但是调用时不必传入相应的参数。

  • self 代表的是类的实例,代表当前对象的地址,而 self.__class__ 则指向类,通过self可以调用类的属性
  • self 不是 python 关键字,我们把它换成其他变量也是可以正常执行的

# Student类包括两个成员属性 name和age,还包括一个成员方法
class Student:
    name=None
    age=0
    def printf(self,name,age):
       print(self)
       self.name=name
       self. age=age
       print("name ", {self.name}, "age", {self.age},"self.__class__",self.__class__)

stu=Student()
stu.printf("张三",18)

构造方法

 __init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法

python里一个class不可以定义多个构造函数,一个class只能有一个用于构造对象的__init__函数,这时,可以使用不定长参数接收多个参数

析构函数 __del__ ,__del__在对象销毁的时候被调用,当对象不再被使用时,__del__方法运行


# Student类包括两个成员属性 name和age,还包括一个成员方法
class Student:
    name=None
    age=0
    # 成员方法
    def printf(self):
       print(self)
       print("name ", {self.name}, "age", {self.age},"self.__class__",self.__class__)
    # 构造方法
    def __init__(self,name,age):
        self.name=name
        self.age=age

stu=Student("张三",18)   #创建对象 调用构造方法
stu.printf()

 内置方法

一个类中,包含了多种内置方法,实现了不同的功能,称为魔术方法

1、字符串转换:控制类对象的转化

正常打印类对象时,得到的是类变量的内存地址

 str方法:返回自定义字符串,执行此类对象的print方法,自动调用str方法

# Student类包括两个成员属性 name和age,还包括一个成员方法
class Student:
    name=None
    age=0
    # 成员方法
    def printf(self):
       print(self)
       print("name ", {self.name}, "age", {self.age},"self.__class__",self.__class__)
    # 构造方法
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __str__(self):
        return f"Student变量: name={self.name},age={self.age}"
stu=Student("张三",18)   #创建对象 调用构造方法
print(stu)

 2、lt:小于比较

直接对两个类对象,进行比较是不可以的。要通过lt方法制定比较规则


# Student类包括两个成员属性 name和age,还包括一个成员方法
class Student:
    name=None
    age=0
    # 构造方法
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __str__(self):
        return f"Student变量: name={self.name},age={self.age}"
    def __lt__(self, other):
        return self.age<other.age

stu=Student("张三",18)   #创建对象 调用构造方法
stu1=Student("张三",18)   #创建对象 调用构造方法
print(stu<stu1)


3、le:小于等于比较


# Student类包括两个成员属性 name和age,还包括一个成员方法
class Student:
    name=None
    age=0
    # 构造方法
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __str__(self):
        return f"Student变量: name={self.name},age={self.age}"
    def __le__(self, other):
        return self.age<=other.age

stu=Student("张三",18)   #创建对象 调用构造方法
stu1=Student("张三",18)   #创建对象 调用构造方法
print(stu<=stu1)


4、eq方法:判断是否相等

不重写eq方法,默认比较的是两个对象的内存地址,肯定不相等


# Student类包括两个成员属性 name和age,还包括一个成员方法
class Student:
    name=None
    age=0
    # 构造方法
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __str__(self):
        return f"Student变量: name={self.name},age={self.age}"
    def __eq__(self, other):
        return self.name==other.name

stu=Student("张三",10)   #创建对象 调用构造方法
stu1=Student("张三",18)   #创建对象 调用构造方法
print(stu==stu1)


关系运算是比较2个对象,包括:

关系运算含义
__lt__X<Y
__gt__X>Y
__le__X<=Y
__ge__X>=Y
__eq__X==Y
__ne__X!=Y
__cmp__比较X和Y,用于sorted,返回值是-1,1,0

面向对象有三大特征:封装、继承、多态

封装

封装:将现实中的事物转化为类

私有属性,只可以在类中被使用,在其余地方都无法使用


class Student:
    __age=10  #age是私有变量
    __name="张三"  #name是私有变量
    def __printf(self): #私有方法 对象不可以调用此方法
        print("name ", {self.__name}, "age", {self.__age})
    def init(self):  #公开方法
        self.__printf()
stu=Student()
stu.init()

继承

子类继承父类,得到父类的公开属性

python支持多继承:一个子类可以继承多个父类,如果多个父类中包含了同名属性,以左侧的父类为准

class Aniaml:
    name=None
    __age=0
    def eat(self):
        print(self.name+"正在吃东西")

#Bird类继承了Aniaml父类,得到了Aniaml类的公开属性
class Bird (Aniaml):
    def fly(self):
        print("鸟在飞")


bird =Bird()
bird.name="糖豆"
bird.fly()
bird.eat()

在python中继承中的一些特点:


  1. 子类不重写 __init__,实例化子类时,会自动调用父类定义的 __init__。
  2. 子类重写了__init__ 时,实例化子类,就不会调用父类已经定义的 __init__
  3. 子类重写了__init__ 时,要使用父类的构造方法,可以使用 super 关键字,语法:super(子类,self).__ init __(参数);也可以使用如下格式调用:父类名.__init__(self, 参数列表

这里和java不一样的是,java是子类先帮父类构造,如果父类只包含无参的构造方法,创建子类对象会自动先调用父类无参的构造方法,如果父类存在包含参数的构造方法,就要使用super关键字显示调用


class A:
    age=0
    def __init__(self,*args):
        self.age=args[0]
        print("父类A的有参构造方法",{self.age})
        print("离开父类的有参构造方法")

class B (A):
    def __init__(self,age):
       print("子类B的构造方法")
       super(B, self).__init__(age)
       print("离开子类B")

class C(B,A):  #这里不是A,B这样的传参顺序,是因为B类继承了A类,如果是A,B顺序,先创建A对象,创建B对象也会创建A对象,python不允许这样
    def __init__(self, age):
        super(C, self).__init__(age)
        print("子类C的构造方法")
        print("离开子类C")
C(10)

  • 2、Python 总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)

重写

子类可以对父类方法重写,调用时执行重写后的方法


class Aniaml:
    name=None
    __age=0
    def eat(self):
        print(self.name+"正在吃东西")

#Bird类继承了Aniaml父类,得到了Aniaml类的公开属性
class Bird (Aniaml):
    def fly(self):
        print("鸟在飞")

    def eat(self):  #对父类的这个方法进行重写
        print("有一只鸟正在吃东西")

bird =Bird()
bird.fly()
bird.eat()

 super关键字:在子类中调用父类属性

super().成员变量

super().成员方法()

 重载

Python 是一种动态语言,不需要声明变量类型。该函数可以接受任何类型的参数,因此不支持根据参数类型进行重载。但是可以支持运算符重载

python支持运算符如下:

 


class A:
    def __init__(self,x,y):
        self.x=x
        self.y=y

    def __str__(self):
        return  f"x={self.x},y={self.y}"
    def __sub__(self, other):
        return A(self.x-other.x,self.y-other.y)
a=A(1,2)
b=A(3,6)
print(a.__sub__(b))   # 1-3=-2   2-6=-4

多态

在完成某一个行为时,通过不同的对象,执行不同的方法

class AC:
    def ac(self):
        pass

pass关键字起到占位符的作用,ac方法没有方法体,pass是为了让ac方法符合语法规定添加的。

这样没有方法体的方法称为抽象方法,包含抽象方法的类就是抽象类

抽象类是要被继承的,子类要重写抽象父类的抽象方法


class AC:
    def ac(self):
        pass
class A (AC):
    def ac(self):
        print("A子类重写父类AC的ac方法")
class B (AC):
    def ac(self):
        print("B子类重写父类AC的ac方法")

def printf(tmp :AC):
    tmp.ac()
printf(A())
printf(B())

printf方法的执行,取决于参数tmp的实际类型

tmp是A类型,它实际上拥有自己的 ac()方法。调用 tmp.ac()总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止。

python是动态类型的语言,所以,传递给函数 printf(tmp)的参数tmp 不一定是 AC 或 AC 的子类型。任何数据类型的实例都可以,只要它有一个ac()的方法即可

单下划线、双下划线、头尾双下划线说明:

  • __foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的。

  • _foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *

  • __foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。

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

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

相关文章

ENSP防火墙进入web登陆界面

步骤 新建拓扑【选择USG6000V】然后导入USG6000V得镜像包进入到防火墙的CLI界面 账户与密码 账户&#xff1a;admin 密码Admin123&#xff08;密码输入不会显示&#xff09; 输入正确账户密码后会提醒修改密码输入 y 回车后提醒如下&#xff1a; 输入旧密码 输入新密码&…

基于禁忌搜索的TSP问题求解仿真输出路线规划图和收敛曲线

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 禁忌搜索&#xff08;Tabu Search或Taboo Search&#xff0c;简称TS&#xff09;是对局部搜索&#xff08;LS&#xff09;的一种扩展&#xff0c;是一种全局寻优算法&#xff0c;其特点是采用禁忌…

践行者访谈实录:你真的了解CMMI吗?

2022年12月21日晚8点&#xff0c;我参与了《践行者》访谈节目&#xff0c;历时2小时&#xff0c;就CMMI有关的话题和主持人徐东伟老师&#xff0c;和热心的听众进行了在线交流。节目结束后&#xff0c;禅道公司的小朋友们整理了文字记录如下。 相信大家对CMMI的认知或多或少地…

Android自定义ViewGroup的布局,往往都是从流式布局开始

前言 前面几篇我们简单的复习了一下自定义 View 的测量与绘制&#xff0c;并且回顾了常见的一些事件的处理方式。 那么如果我们想自定义 ViewGroup 的话&#xff0c;它和自定义View又有什么区别呢&#xff1f;其实我们把 ViewGroup 当做 View 来用的话也不是不可以。但是既然…

端到端网络全链路监控方案

结构日渐复杂&#xff0c;设备类型、设备数量逐渐增加&#xff0c;设备间的连接关系随之复杂化&#xff0c;同时随着无线网络的发展&#xff0c;网络中的连接关系逐渐去“线”化&#xff0c;如何可观、高效的对网络间复杂的连接关系进行监控和管理&#xff0c;成为用户不可忽视…

2022年最好用的五款设备管理软件

工厂是典型的设备密集型组织&#xff0c;设备固定资产具有数量多、种类多、使用周期长、使用地点分散等特征。如果依然在使用传统的手工记录数据、手工巡检、纸质维保、电话维修的方式&#xff0c;势必给企业带来损失。 设备是众多企业经营中支出的主要组成部分&#xff0c;在…

(二十)Vue之非单文件组件

文章目录基本使用一、如何定义一个组件&#xff1f;二、如何注册组件&#xff1f;三、如何使用组件&#xff1f;演示程序普通Vue程序单文件组件程序局部注册全局注册几个注意点1.关于组件名2.关于组件标签3.一个简写方式组件的嵌套使用关于VueComponent一个重要的内置关系&…

Shape详解

Spape详解 1.自定义背景shape 1.1gradient 1.简介 定义渐变色&#xff0c;可以定义两色渐变和三色渐变&#xff0c;及渐变样式&#xff0c;它的属性有下面几个2.属性 angle&#xff0c;只对线性渐变是有效的放射性渐变必须指定放射性的半径&#xff0c;gradientRadiouscentetX和…

Ubuntu安装redis服务器

官网下载redis服务器的压缩包redis-6.0.16.tar.gz 点击download 6.2.8或任意版本即可。 上传下载的压缩包到服务器或者本地虚拟机 解压压缩包&#xff0c;并安装gcc tar -zxvf redis-6.0.16.tar.gz解压之后可以看到redis的目录结构&#xff1a; 没有bin目录&#xff0c;而redi…

Meta CTO专访:2023年AR/VR、元宇宙的下一步怎么走

2022年对于Meta来说注定是不平凡的一年&#xff0c;它经历了股价大跌、万人大裁员、项目重组、季度营收首次下滑、Reality Labs季度亏损破纪录&#xff0c;甚至前不久Meta AR/VR业务的元老级人物、Reality Labs顾问CTO John Carck也宣布离职&#xff0c;这件事对于Meta甚至整个…

HEVC学习之CTU划分

一,CTU相关概念 H.265将图像划分为“树编码单元&#xff08;coding tree units, CTU&#xff09;”&#xff0c;而不是像H.264那样的1616的宏块。根据不同的编码设置&#xff0c;树编码块的尺寸可以被设置为6464或有限的3232或1616。 上图就是一个6464树编码块的分区示例&am…

数字ic验证|SoC的功能验证

随着设计的进行&#xff0c;越接近最后的产品&#xff0c;修正一个设计缺陷的成本就会越高。 1.功能验证概述 在IC设计与制造领域&#xff0c;通常所说的验证&#xff08;Verification&#xff09;和测试&#xff08;Test&#xff09;是两种不同的事 验证 在设计过程中确认…

PHP 实现PDF转图片

目录 1.环境配置&#xff1a; 2.实现原理&#xff1a; 3.安装php扩展imagick 4.安装ghostscript 5.pdf转图片 1.环境配置&#xff1a; 2.实现原理&#xff1a; Php使用扩展插件imagick进行图片处理&#xff0c;处理pdf时使用imagick去调用ghostscript 3.安装php扩展imag…

spring-boot如何自行写一个starter并且使用

这里说的starter是pom中引入的一系列starter包&#xff0c;比如spring-boot-starter-web、mybatis-plus-boot-starter等。本文先已mybatis-spring-boot-starter的使用进行说明&#xff0c;然后得到使用的流程&#xff08;套路&#xff09;&#xff0c;然后根据该流程&#xff0…

ddim原理及代码(Denoising diffusion implicit models)

前言 之前学习了 DDPM(DDPM原理与代码剖析)和 IDDPM(IDDPM原理和代码剖析)&#xff0c; 这次又来学习另一种重要的扩散模型。它的采样速度比DDPM快很多(respacing)&#xff0c;扩散过程不依赖马尔科夫链。 Denoising diffusion implicit models, ICLR 2021 理论 Astract和Int…

百果园通过港交所上市聆讯:八成营收来自加盟店,余惠勇为董事长

撰稿|汤汤 来源|贝多财经 近日&#xff0c;深圳百果园实业&#xff08;集团&#xff09;股份有限公司&#xff08;下称“百果园”&#xff09;通过港交所上市聆讯&#xff0c;并披露了聆讯后招股书。 根据招股书介绍&#xff0c;百果园是中国最大的水果零售经营商。根据弗若斯…

数据库实验6 存储过程实验

前言&#xff1a;游标的mysql代码不懂写&#xff0c;所以没有运行结果 实验6 存储过程实验 实验6.1 存储过程实验 1.实验目的 掌握数据库 PL/SQL 编程语言&#xff0c;以及数据库存储过程的设计和使用方法。 2.实验内容和要求 存储过程定义,存储过程运行,存储过程更名,存…

股票价、量走势图绘制

在证券投资分析领域中价、量走势分布图是投资者常用的一个参考方面。本案例主要介绍股票每日收盘价格、成交量的走势图以及月交易量分布饼图的绘制技能&#xff0c;并进一步介绍了子图的绘制方法。今有股票代码600000行情交易数据表&#xff08;trd.xlsx&#xff09;&#xff0…

SPDK线程模型

一、reactor线程 与传统的reactor线程模型相比&#xff0c;SPDK的reactor在功能实现上还是有很大区别的&#xff0c;线程不在基于流水线形式进行作业&#xff0c;而是采用Run-To-Complete来做运行处理。 如图所示&#xff0c;每个reactor线程会绑定一个cpu core&#xff0c;线…

力扣刷题笔记day7(数组中重复的数字+在排序数组中查找数字+0~n-1中缺失的数字)

文章目录数组中重复的数字题目思路代码在排序数组中查找数据题目思路代码0&#xff5e;n-1中缺失的数字题目思路代码数组中重复的数字 题目 思路 创建一个哈希表&#xff0c;将数组遍历&#xff0c;如果不存在则添加到哈希表中&#xff0c;如果存在则直接返回 代码 var fin…