零基础学Python之面向对象

1.面向对象编程简介

(1)什么是面向对象

面向对象程序设计(Object Oriented Programming)作为一种新方法,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。模型是用来反映现实世界中事物特征的。任何一个模型都不可能反映客观事物的一切具体特征,只能对事物特征和变化规律的一种抽象,且在它所涉及的范围内更普遍、更集中、更深刻地描述客体的特征。通过建立模型而达到的抽象是人们对客体认识的深化。

Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。

(2)面向对象技术简介

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

(3)创建类语法

class ClassName:'类的帮助信息'   #类文档字符串class_suite  #类体
# 创建一个Person类,定义函数
class Person:def introduce_self(self):print("自定义函数")# 实例化对象
person = Person()
person.introduce_self()# 定义类名需要使用驼峰的命名方式。
# 通过id函数证明实例化出来的两个对象都是不同的
person1 = Person()
person2 = Person()
print(id(person1))
print(id(person2))

2.类的构造函数

构造函数,是一种特殊的方法,主要用来创建对象的时候去初始化对象,即为对象成员变量附初始值。

构造函数每次实例化对象的时候,均会帮我们自动执行构造函数里的代码。

在python中,使用_init_ 作为构造函数,如果不显式写构造函数,python会自动创建一个无任何操作的默认构造函数。

class Person:def __init__(self):print("person")person1 = Person()
person2 = Person()# 输出:person

作为模板,在构造函数中,为必须的属性绑定对应的值。

class Person:def __init__(self, name, age, height):self.name = nameself.age = ageself.height = heightdef introduce_self(self):print(self.name, self.age, self.height)# 实例化对象的时候,为属性赋值
person = Person("lixiang", 11, 11)
# 调用对象方法可以使用对象名.方法名()
person.introduce_self()# 输出:lixiang 11 11

注意:当使用了构造函数,且构造函数式带参的且无默认参数,此时,实例化对象的时候,必须显式入参,否则会报错。若要避免错误,可以在构造函数使用默认参数。

3.类变量与实例变量

类变量: 类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。类变量在整个实例化的对象中是公用的。

实例变量: 定义在方法中的变量,用 self 绑定到实例上,只作用于当前实例的类。

访问实例变量可以使用对象名.属性,访问类变量可以使用类名.属性。

class Person:# 类变量total = 0def __init__(self, name, age, height):# 实例变量self.name = nameself.age = ageself.height = heightperson = Person("lixiang", 11, 12)
print(person.name)
# 如果要修改实例变量的值,可以使用对象名.属性=新值的方式进行赋值
person.name = "zhangsan"
print(person.name)
print(person.total)
# 如果要修改类变量的值,可以使用类名.属性=新值的方式进行赋值
Person.total = 1
print(person.total)# 输出:
# lixiang
# zhangsan
# 0
# 1

实例变量查找规则:先从实例变量里面找,找不到,看看类变量有没有,没有的话,去父类找,还是找不到报错。

print(person.total)之所以没有报错,就是这个原因。

在对象里面,有一个__dict__对象,存储着对象相关的属性。

print(person.__dict__)# 输出:{'name': 'zhangsan', 'age': 11, 'height': 12}
# 以字典的形式输出,输出对象的相关属性。

同样,类也有对应的__dict__,存储着与类相关的信息。

print(Person.__dict__)# 输出:{'__module__': '__main__', 'total': 1, '__init__': <function Person.__init__ at 0x10e7bc4a0>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None}

除了__dict__,还有以下几个Python的内置属性。

  • _doc_ :类的文档字符串
  • _name_: 类名
  • _module_: 类定义所在的模块(类的全名是’main.className’,如果类位于一个导入模块mymod中,那么className.module 等于 mymod)
  • _bases_ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)

4.实例方法与self关键字

实例方法: 与实例变量类似,属于实例化之后的对象,定义实例方法至少要有一个self入参,调用是不需要传,只能由实例对象调用。

self关键字: self指向实例本身,我们在实例方法中要访问实例变量,必须使用self.变量名的形式。

class Person:total = 0def __init__(self, name, age, height):self.name = nameself.age = ageself.height = heightdef info(self):print("hello,my name is %s,my age is %d and i'm %d height" % (self.name,self.age, self.height))# 输出:hello,my name is lixiang,my age is 11 and i'm 12 height

注意:不能直接使用类名去访问实例方法。

5.类方法与静态方法

类方法: 类方法使用装饰器@classmethod。第一个参数必须是当前类对象,该参数名一般约定为“cls”(不是cls也没关系,但是,约定俗成的东西不建议变动),通过它来传递类的属性和方法(不能传实例的属性和方法)

其调用对象可以是实例对象和类。

class Person:total = 0@classmethoddef print_detail(cls):cls.total = 1print(cls.total)
# 实例话对象的时候,使用类名,即可完成实例化
Person.print_detail()# 输出:1 

静态方法: 使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,但是方法体中不能使用类或实例的任何属性和方法。

静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,逻辑上属于类,但是和类本身没有关系,也就是说在静态方法中,不会涉及到类中的属性和方法的操作。可以理解为,静态方法是个独立的、单纯的函数,它仅仅托管于某个类的名称空间中,便于使用和维护。

class Person:total = 0@staticmethoddef print_detail():print("hello word")
Person.print_detail()# 输出:hello word

6.变量方法访问限制

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

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

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

foo: 什么都不加表示公有类型(public)的变量。

class Person():# 构造函数,用于为成员变量赋初始值def __init__(self, name):# 属性私有化self.__name = name# 只能通过提供的set方法去进行设置值def set_name(self, name):self.name = name# 私有方法,只能在当前类中进行调用def __info(self):print("my name is %s" % self.name)

7.面向对象之继承

继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。

Python中在定义类的时候,类名后有个括号,当括号里写着另外一个类的名字时,表示该类继承于另外一个类。

# 定义动物类
class Animal:def __init__(self, name):self.name = namedef eat(self):print(self.name,":吃饭")class Dog(Animal):# 子类可以有自己的属性与方法def  eat_bones(self):print(self.name,":吃骨头")class Cat(Animal):passdog = Dog("狗")
dog.eat()
dog.eat_bones()cat = Cat("猫")
cat.eat()# 输出:
# 狗 :吃饭
# 狗 :吃骨头
# 猫 :吃饭

注意:子类具备父类所有的属性与功能,但是父类并不具备子类的属性与功能。

当子类有自己的构造方法时,将会覆盖父类的构造方法。

class Animal:def __init__(self):print("Animal")
# Dog继承animal
class Dog(Animal):def __init__(self):print("Dog")
dog = Dog()# 输出:Dog

子类可以重写父类方法,重写之后,当子类对象调用该方法时,执行的是子类中的方法实现。

class Animal:def __init__(self):print("Animal")def eat(self):print("Animal is eating")
# Dog继承animal
class Dog(Animal):def eat(self):print("Dog is eating")
dog = Dog()
dog.eat()# 输出:Dog is eating

注意: 当且仅当子类方法与父类同名,入参相同,才可称之为重写父类的方法。

8.super的作用及其用法

super() 函数是用于调用父类(超类)的一个方法。一般是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用等种种问题。

语法:super(类名,self)

在python3中,可以直接使用super()而无需任何参数来调用父类。

class Animal:def __init__(self, name):self.name = name
# Dog继承animal
class Dog(Animal):def __init__(self, name):super(Dog, self).__init__(name)print("Dog")
dog = Dog("Tom")
print(dog.__dict__)
print(dog.name)# 输出:
# Dog
# {'name': 'Tom'}
# Tom

9.抽象方法与多态

抽象方法:在面向对象编程语言中抽象方法指一些只有方法声明,而没有具体方法体的方法。抽象方法一般存在于抽象类或接口中。抽象类的一个特点是它不能直接被实例化,子类要么是抽象类,要么,必须实现父类抽象类里定义的抽象方法。

在python3中可以通过使用abc模块轻松的定义抽象类。

from abc import ABCMeta, abstractmethod
# 定义抽象类时,使用metaclass=ABCMeta
class Animal(metaclass=ABCMeta):# 抽象方法加上@abstractmethod注解@abstractmethoddef eat(self):pass
class Dog(Animal):def eat(self):print("dog is eating")
dog = Dog()
dog.eat()

注意:抽象类的子类必须实现抽象类中所定义的所有方法,否则,程序不能正确运行。会报 TypeError: Can't instantiate abstract class Dog with abstract methods run 这个错误。

多态:不同的 子类对象调用 相同的 父类方法,产生 不同的 执行结果,可以增加代码的外部 调用灵活度。

from abc import ABCMeta, abstractmethod
class Animal(metaclass=ABCMeta):@abstractmethoddef eat(self):pass@abstractmethoddef run(self):passdef activity(self):self.eat()self.run()class Dog(Animal):def eat(self):print("Dog is eating")def run(self):print("dog is running")class Cat(Animal):def eat(self):print("cat is eating")def run(self):print("cat is running")
# 不同的子类对象,调用父类的activity方法,产生不同的执行结果
dog = Dog()
cat = Cat()
dog.activity()
cat.activity()
# 输出:
# Dog is eating
# dog is running
# cat is eating
# cat is running 

10.Python多继承

Python多继承会拥有所有父类的方法。

class Father:def power(self):print("大力")class Mother:def sing(self):print("唱歌")class Me(Father, Mother):passme = Me()
me.power()
me.sing()# 输出:
# 大力
# 唱歌

当继承多个父类时,如果父类中有相同的方法,那么子类会优先使用最先被继承的方法。

class Father:def eat(self):print("喜欢吃红烧猪排骨")class Mother:def eat(self):print("喜欢吃咸菜小米粥")class Me(Father, Mother):passme = Me()
me.eat()# 输出:喜欢吃红烧猪排骨

11.Python枚举类

(1)什么是枚举

在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。

定义枚举类继承Enum类。

from enum import Enum, unique
class Class(Enum):JAVA = 1PYTHON = 2GO = 3def test(clazz):if clazz == Class.JAVA:print("JAVA")elif clazz == Class.PYTHON:print("PYTHON")else:print("GO")test(Class.JAVA)

通过枚举成员获取key以及value。

# 通过枚举成员获取名字
print(Class.JAVA.name)
# 通过枚举成员获取值
print(Class.JAVA.value)# 输出:
# JAVA
# 1

通过值获取枚举成员。

print(Class(1))# 输出:JAVA

注意:定义枚举时,其枚举成员的名称不允许相同。

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

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

相关文章

StarRocks 1 月社区动态(2024)

StarRocks 在 2023 年不断进化&#xff0c;锤炼核心功能&#xff0c;打磨全新特性&#xff0c;成功实现了从全场景 OLAP 到云原生湖仓的全面升级&#xff0c;成为湖仓新范式的造浪者。2024 年&#xff0c;我们期待与您一同续写新篇章&#xff0c;共同迈向“极速统一”的新征程&…

使用#if 和 #endif 实现注释,及原因

注释我们代码中经常使用&#xff0c; 单行注释和多行注释我们都会经常用到。 但是有些场景下这两种注释并不是很方便&#xff0c;这样我们就可以使用上面的两个宏来对代码进行注释。 什么情况下使用那两种注释不方便? 1. 如果代码很多时&#xff0c;我们如果一行一行…

【Qt】常见问题

1.存在未解析的标识符 将build文件夹删掉重新编译。 2.左侧项目目录栏无法删除已添加项目 打开目标项目上一级的pro文件&#xff0c;将目标文件名字注释或者删除掉&#xff0c;最后保存&#xff0c;qt就会自动更新&#xff0c;将该项目隐藏掉。 3.在qt creator下添加槽函数…

c++运算符优先级

这里写目录标题 C运算符优先级定义了表达式中运算符的计算顺序。当一个表达式中有多个运算符时&#xff0c;运算符的优先级决定了哪些运算符先被计算。下面是C中一些常见运算符的优先级列表&#xff0c;从高到低排序&#xff1a; 阿里云参考链接&#xff1a;developer.aliyun.c…

模拟串口LV2,解决硬件串口资源不足问题!!!!

模拟串口通信 2.0 版本&#xff01;&#xff01; 我在前面的文章里面有写了 虚拟串口通信&#xff0c;虽然说能用&#xff0c;但是用过的小伙伴都说 “好!” 优缺点: 先说一点&#xff0c;2.0版本并不适用于同硬件串口的所有场合&#xff0c;仅仅针对自己开发的电子垃圾的主…

[office] 网优必备的10大经典函数公式! #知识分享#媒体

网优必备的10大经典函数公式! Excel软件看似简单&#xff0c;其实花样很多&#xff0c;尤其Excel表格。但其实只要用心多练&#xff0c;效率轻松提升个十倍百倍真不是问题!赶紧一起来get新技能吧~ ▋函数公式一 我们都知道从网管中查询出来的经纬度是没有小数点的。我看到不…

护眼灯色温多少合适?推荐五款合适色温的护眼台灯

很多人在购买台灯之后只会根据周围环境灯光的明暗调节亮度&#xff0c;对于色温的了解并不多&#xff0c;不知道色温应该调节到什么数值比较合适&#xff0c;有些人也根本没有意识到色温在影响人情绪方面起着重要作用&#xff0c;接下来就一起来看一下色温的标准。 一、什么色…

Day4.

单链表 #include <head.h>typedef struct List{int value;struct List *pointe; }*list; list create_space() {list s(struct List *)malloc(sizeof(struct List)); //向堆区申请空间s->pointe NULL;//初始化s->value 0;return s; } list inserhead_list(lis…

AI改编游戏大电影《使命召唤:幽灵重生》(下)

AI改编游戏大电影《使命召唤&#xff1a;幽灵重生》&#xff08;下&#xff09; 幽灵重生携生化武器毁灭人类&#xff0c;普莱斯上尉点上雪茄拿起武器&#xff0c;英雄再次迎来使命的召唤&#xff01; 《使命召唤&#xff1a;幽灵重生》&#xff08;下&#xff09;&#xff1a…

电力负荷预测 | 基于TCN的电力负荷预测(Python)———结果比对

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 电力负荷预测 | 基于TCN的电力负荷预测(Python)———结果比对 python3.8 keras2.6.0 matplotlib3.5.2 numpy1.19.4 pandas1.4.3 tensorflow==2.6.0

【宝藏系列】嵌入式入门概念大全

【宝藏系列】嵌入式入门概念大全 0️⃣1️⃣操作系统&#xff08;Operating System&#xff0c;OS&#xff09; 是管理计算机硬件与软件资源的系统软件&#xff0c;同时也是计算机系统的内核与基石。操作系统需要处理管理与配置内存、决定系统资源供需的优先次序、控制输入与输…

jquery写表格,通过后端传值,并合并单元格

<!DOCTYPE html> <html> <head><title>Table Using jQuery</title><style>#tableWrapper {width: 100%;height: 200px; /* 设置表格容器的高度 */overflow: auto; /* 添加滚动条 */margin-top: -10px; /* 负的外边距值&#xff0c;根据实际…

Days 20 ElfBoard 板 FFmpeg移植

FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。因此&#xff0c;对于从事多媒体技术开发的工程师来说&#xff0c;深入研究FFMPEG成为一门必不可少的工作…

C++ 11新特性之tuple

概述 在C编程语言的发展历程中&#xff0c;C 11标准引入了许多开创性的新特性&#xff0c;极大地提升了开发效率与代码质量。其中&#xff0c;tuple&#xff08;元组&#xff09;作为一种强大的容器类型&#xff0c;为处理多个不同类型的值提供了便捷的手段。tuple是一种固定大…

NLP_神经概率语言模型(NPLM)

文章目录 NPLM的起源NPLM的实现1.构建实验语料库2.生成NPLM训练数据3.定义NPLM4.实例化NPLM5.训练NPLM6.用NPLM预测新词 NPLM小结 NPLM的起源 在NPLM之前&#xff0c;传统的语言模型主要依赖于最基本的N-Gram技术&#xff0c;通过统计词汇的共现频率来计算词汇组合的概率。然而…

解决opencv在图片中添加中文字体乱码问题

解决opencv在图片中添加中文字体乱码问题 需要事先安装PIL库 from PIL import Image, ImageDraw, ImageFont import cv2def cv2_img_add_text(img, text_str, left, top, text_color, text_size): if isinstance(img, np.ndarray):img Image.fromarray(cv2.cvtColor(img, …

【自然语言处理】微调 Fine-Tuning 各种经典方法的概念汇总

【自然语言处理】微调 Fine-Tuning 各种经典方法的概念汇总 前言请看此微调 Fine-TuningSFT 监督微调&#xff08;Supervised Fine-Tuning&#xff09;概念&#xff1a;监督学习&#xff0c;无监督学习&#xff0c;自监督学习&#xff0c;半监督学习&#xff0c;强化学习的区别…

Jetpack之RadionBtton、Switch、Checkbox组件介绍

Jetpack Compose系列(9) - RadionBtton、Switch、Checkbox组件介绍 RadioButton 跟View体系一样&#xff0c;Compose也有RadioButton单选按钮组件&#xff0c;遵从Material Design风格。 其构造函数如下&#xff1a; Composable fun RadioButton(selected: Boolean,onClick…

uniapp+uView 【详解】录音,自制音频播放器

效果预览 代码实现 <template><view class"btnListBox"><view class"audioBox" v-if"audioLength"><u-row><u-col span"2"><u--text aligncenter :text"currentTime"></u--text>…

YOLOv8改进 | 检测头篇 | 独创RFAHead检测头超分辨率重构检测头(适用Pose、分割、目标检测)

一、本文介绍 本文给大家带来的改进机制是RFAHead,该检测头为我独家全网首发,本文主要利用将空间注意力机制与卷积操作相结合的卷积RFAConv来优化检测头,其核心在于优化卷积核的工作方式,特别是在处理感受野内的空间特征时。RFAConv主要的优点就是增加模型的特征提取能力,…