python面对对象编程

2023-11-05

什么是面对对象编程

程序设定的范式

面对对象编程可以是代码程序更加的可控更加让人理解

面对对象编程就是把现实世界变得抽象并建立起对象模型

程序就是不同对象之间相互调用的逻辑

例:人 动物 车

这些都是现实世界的东西那就可以在这段代码中抽象出这三种模型

这些模型之间都有一些联系

例:人养宠物 宠物又属于动物那么人和动物就有关系

人会购买车 会驾驶车 那么人和车又有关系

如果我们要在代码例实现这些关系的话那么久形成了面对对象的程序

实际就是不同对象相互调用的逻辑

我们抽象出的人在代码中属于类的这种概念

在现实世界我们抽象出的每一个对象在代码例就称之为类

对有每个人都会有 姓名 性别 年龄 像这些可以描述人的称之为属性

人是抽象出来的像 小明 小红 这些具体的人就叫实例

像人到具体的人就叫实例化

类的定义与实例化

在pytho里 通过class关键词来定义一个类比如我们需要定义一个人的类。按照 Python 的编程习惯,类名以大写字母开头可以这样定义:

class Person:  pass

需要注意,在这个Person类的定义里面,并没有继承任何类,除了这样定义以外,还可以有以下两种定义方式

 class Person(): pass  class Person(object):  pass

这三种情况有什么区别呢?在Python3中,是没有区别的,但是在Python2中,则有一定的区别。
在Python2中,对于第一种定义的方法,Person类只有有限的几个内建函数'__doc__', '__module__', 'name',而对于第二种、第三种定义的方法,则会继承Python object对象的更多的内建函数,可以更便捷的操作对象。这是Python2版本的差异。在Python3中,我们只需要知道这三种方式都可以定义一个类即可。

定义了类之后,就可以对类进行实例化了,实例化是指,把抽象的类,赋予实物的过程。比如,定义好Person这个类后,就可以实例化多个Person出来了。
创建实例使用类名+(),类似函数调用的形式创建:

 class Person(object):  pass xiaohong = Person() xiaoming = Person()
 

实例属性的定义

虽然前面我们已经通过Person类创建出xiaoming、xiaohong等实例,但是这些实例看上去并没有任何区别。在现实世界中,一个人拥有名字、性别、年龄等等的信息,在Python中,可以通过以下的方式赋予实例这些属性,并且把这些属性打印出来

xiaohong.name = 'xiaohong'
xiaohong.sex = 'girl'
xiaohong.age = 13

print(xiaohong.name)
print(xiaohong.sex)
print(xiaohong.age)

除此以外,这些属性也可以和普通变量一样进行运算。比如xiaohong长大了一岁:

xiaohong.age = xiaohong.age + 1

实例属性的初始化

通过前面的方式定义一个实例的属性非常方便,但也有一些问题。
首先,如果定义属性的过程中使用了不同的属性名字,比如性别,前者使用了sex,后者使用了gender,那对于一个类的不同实例,存储一个信息就用了两个不同的属性,在后面将会难以维护。
其次,名字、性别、年龄等等,都是人的基本信息,在抽象一个类的时候,理应包含这些信息。
在定义 Person 类时,可以为Person类添加一个特殊的__init__()方法,当创建实例时,__init__()方法被自动调用,我们就能在此为每个实例都统一加上以下属性:

class Person(object):
    def __init__(self, name, sex, age):
        self.name = name
        self.sex = sex
        self.age = age

需要注意的是,__init__() 方法的第一个参数必须是 self(也可以用别的名字,但建议使用习惯用法),后续参数则可以自由指定,和定义函数没有任何区别。
定义类后,就可以相应的实例化对象了,需要注意的是,在实例化的时候,需要提供除self以外的所有参数。

xiaoming = Person('Xiao Ming', 'boy', 13)
xiaohong = Person('Xiao Hong', 'girl', 14)

而访问这些属性的方式和之前的一样:

print(xiaohong.name)
print(xiaohong.sex)
print(xiaohong.age)

但访问不存在的属性时,依然会报错

类属性

类和实例对象是有区别的,类是抽象,是模板,而实例则是根据类创建的对象,比如类:动物,只是一个抽象,并没有动物的详细信息,而猫、狗等,则是具体的动物,是类的对象。

在前面,实例对象绑定的属性只属于这个实例,绑定在一个实例上的属性不会影响其它实例;同样的,类也可以绑定属性,但是类的属性不属于任何一个对象,而是属于这个类。如果在类上绑定一个属性,则所有实例都可以访问类的属性,并且,所有实例访问的类属性都是同一个!也就是说,实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。

定义类属性可以直接在 class 中定义,比如在前面的Animal类中,加入地域的类属性:

class Animal(object):
    localtion = 'Asia'
    def __init__(self, name, age):
        self.name = name
        self.age = age

在上面的代码中,localtion就是属于Animal这个类的类属性,此后,通过Animal()实例化的所有对象,都可以访问到localtion,并且得到唯一的结果。

dog = Animal('wangwang', 1)
cat = Animal('mimi', 3)
print(dog.localtion) # ==> Asia
print(cat.localtion) # ==> Asia
# 类属性,也可以通过类名直接访问
print(Animal.localtion) # ==> Asia

类属性也是可以动态添加和修改的,需要注意的是,因为类属性只有一份,所以改变了,所有实例可以访问到的类属性都会变更:

Animal.localtion = 'Africa'
print(cat.localtion) # ==>Africa
print(dog.localtion) # ==>Africa

 类属性和实例属性的优先级

我们知道,属性可以分为类属性和实例属性,那么问题就来了,如果类属性和实例属性名字相同时,会怎么样,这就涉及Python中类属性和实例属性的优先级的问题了。
我们可以做一个实验,在前面类定义的基础上,在实例属性中,也初始化一个localtion的属性。

​class Animal(object):
    localtion = 'Asia'
    def __init__(self, name, age, localtion):
        self.name = name
        self.age = age
        self.localtion = localtion

接着我们初始化两个实例,并把localtion打印出来

​dog = Animal('wangwang', 1, 'GuangDong')
cat = Animal('mimi', 3, 'ChongQing')
print(dog.localtion) # ==> GuangDong
print(cat.localtion) # ==> ChongQing
print(Animal.localtion) # ==> Asia

可以看的出来,在类属性和实例属性同时存在的情况下,实例属性的优先级是要高于类属性的,在操作实例的时候,优先是操作实例的属性。
还有,当实例没有和类同名的时候,通过实例对象,依然可以访问到类属性。

class Animal(object):
    localtion = 'Asia'
    def __init__(self, name, age):
        self.name = name
        self.age = age

cat = Animal('mimi', 3)
print(cat.localtion) # ==> Asia

 了解这个那么可不可以修改类属性呢?我们来尝试一下:

cat.localtion = 'Africa'
print(Animal.localtion) # ==> Asia

这里依然打印了Asia,可见通过实例是无法修改类的属性的,事实上,通过实例方法修改类属性,只是给实例绑定了一个对应的实例属性: 

​# 新增的实例属性
print(cat.localtion) # ==> Africa

因此,需要特别注意,尽量不要通过实例来修改类属性,否则很容易引发意想不到的错误。

python中的访问限制

并不是所有的属性都可以被外部访问的,这种不能被外部访问的属性称为私有属性。私有属性是以双下划线'__'开头的属性

# 类私有属性
class Animal(object):
    __localtion = 'Asia'

print(Animal.__localtion)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'Animal' has no attribute '__localtion'
# 实例私有属性
class Animal(object):
    def __init__(self, name, age, localtion):
        self.name = name
        self.age = age
        self.__localtion = localtion

dog = Animal('wangwang', 1, 'GuangDong')
print(dog.name) # ==> wangwang
print(dog.age) # ==> 1
print(dog.__localtion)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Animal' object has no attribute '__localtion'

在外部访问私有属性将会抛出异常,提示没有这个属性。
虽然私有属性无法从外部访问,但是,从类的内部是可以访问的。私有属性是为了保护类或实例属性不被外部污染而设计的。

定义实例的方法

在上文提到,私有属性没有办法从外部访问,只能在类的内部操作;那如果外部需要操作私有属性怎么办?这个时候可以通过定义类或者实例的方法来操作私有属性,这里先来介绍实例方法。
实例的方法指的就是在类中定义的函数,实例方法的第一个参数永远都是self,self是一个引用,指向调用该方法的实例对象本身,除此以外,其他参数和普通函数是完全一样的

class Person(object):

    def __init__(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

在上面的定义,name是实例的私有属性,从外部是无法访问的,而get_name(self) 就是一个实例方法,在实例方法里面是可以操作私有属性的,注意,它的第一个参数是self

还有__init__(self, name)其实也可看做是一个特殊的实例方法。

通过定义get_name(self)方法,在外部就可以通过这个方法访问私有属性了

​p = Person('Alice')
print(p.get_name()) # ==> Alice

注意,在外部调用实例方法时,是不需要显式传递self参数的。
另外,通过定义实例方法来操作私有属性的这种方法是推荐的,这种数据封装的形式除了能保护内部数据一致性外,还可以简化外部调用的难度。

当然,实例方法并不仅仅是为私有属性服务的,我们可以把和类的实例有关的操作都抽象成实例方法,比如:打印实例的详细信息等等。

class Animal(object):
    def __init__(self, name, age, localtion):
        self.name = name
        self.age = age
        self.localtion = localtion

    def get_info(self):
        return 'name = {}, age = {}, localtion = {}'.format(self.name, self.age, self.localtion)

dog = Animal('wangwang', 1, 'GuangDong')
print(dog.get_info())

python定义类方法

在上文中,为了操作实例对象的私有属性,我们定义了实例方法;同样的,如果需要需要操作类的私有属性,则应该定义类的方法。
默认的,在class中定义的全部是实例方法,实例方法第一个参数 self 是实例本身。
要在class中定义类方法,需要这么写:

class Animal(object):
    __localtion = 'Asia'
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @classmethod
    def set_localtion(cls, localtion):
        cls.__localtion = localtion

    @classmethod
    def get_localtion(cls):
        return cls.__localtion

print(Animal.get_localtion()) # ==> Asia
Animal.set_localtion('Afica')
print(Animal.get_localtion()) # ==> Africa

与实例方法不同的是,这里有两点需要特别注意:

  1. 类方法需要使用@classmethod来标记为类方法,否则定义的还是实例方法
  2. 类方法的第一个参数将传入类本身,通常将参数名命名为 cls,上面的 cls.__localtion 实际上相当于Animal.__localtion。

       因为是在类上调用,而非实例上调用,因此类方法无法获得任何实例变量,只能获得类的引用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python面对对象编程 的相关文章

  • Python格式化输出之format函数

    format函数是Python中一个很强大的格式化输出函数 使用花括号 来占位 下面结合代码来讲述format函数的用法 一 匹配顺序 print 姓名 年龄 format 张三 25 运行结果 姓名 张三 年龄 25 可以看出 forma
  • Mac 终端进入 conda 虚拟环境后 pip 依然安装到全局下的问题解决

    一 问题起因 之前折腾安装各种软件 可能是不小心改了些什么莫名奇妙的设置 然后就出现了问题 mac 系统 Catalina 版本10 15 5 在 anaconda 中创建了新的虚拟环境 比如 test 然后在 mac 终端中 输入sour
  • OpenCV绘制透明底的图片,简单易懂讲解alpha通道怎么用

    今天忽然想做抠图和图形绘制 那这里就涉及到一个透明底的问题 OpenCV是很强大的 但是网上大多教程并没有讲清楚 alpha 通道的参数怎么设置 首先我们来看最简单的非 alpha 通道代码 import numpy as np impor
  • python的json模块中dumps和loads、dump和load以及报错JSONDecode:Expecting property name enclosed in double quotes:

    python的json模块中dumps和loads dump和load import json data 1 a 2 b 3 c 数据 1 dumps和loads 注意 dumps和loads不仅仅对字典起作用 dumps 将python对
  • Python获取当前时间(time模块)

    Python获取当前时间 time模块 1 time time 返回当前时间戳 值为按秒计算的浮点数 表示从1970年1月1日0点0分开始 到当前时间 一共经历了多少秒 import time time time 1566028075 37
  • python笔记:#013#高级变量类型

    高级变量类型 目标 列表 元组 字典 字符串 公共方法 变量高级 知识点回顾 Python 中数据类型可以分为 数字型 和 非数字型 数字型 整型 int 浮点型 float 布尔型 bool 真 True 非 0 数 非零即真 假 Fal
  • 基于python手动画出spectrogram(语谱图)

    Spectrogram是基于STFT变换得到的 非常有助于分析信号的时频特性 在语音信号处理中常被称为 语谱图 python中有一些写好的模块可以直接将时域的信号转化成spectrogram 但这并不利于对其原理的理解 而且横纵左边的转换也
  • Python装饰器解析(2)——retrying库使用与源码分析

    retrying简介 retrying功能是为一些任务添加重试机制 只需要指定不同的参数就能便捷实现重试机制逻辑代码 retrying特点 1 通用装饰器API 2 指定停止条件 即按尝试次数限制 3 指定等待条件 即 尝试之间的指数退避休
  • python面对对象编程

    什么是面对对象编程 程序设定的范式 面对对象编程可以是代码程序更加的可控更加让人理解 面对对象编程就是把现实世界变得抽象并建立起对象模型 程序就是不同对象之间相互调用的逻辑 例 人 动物 车 这些都是现实世界的东西那就可以在这段代码中抽象出
  • moviepy基础_1:使用moviepy提取视频的音频及合成

    任务 提取 a mp4 的音频部分 然后把提取到的音频添加到 b mp4 里 程序实现 from moviepy editor import 读取2个视频文件 videoclip 1 VideoFileClip a mp4 videocli
  • Python Pandas 图形绘制(一):折线图,柱状图

    Pandas 图形绘制 一 折线图 柱状图 一 折线图 Line Chart 1 1 默认绘制折线图 df plot 1 2 绘制多条折线 二 柱状图 Bar Chart 2 1 垂直柱状图 df plot bar 2 2 叠加柱状图 st
  • Python 的简洁表达:for语句,if语句,3变量值互换

    Python 语句遵循的是简洁为美的原则 所以有很多表达方式非常简洁 同时在熟练以后也不会牺牲可读性 一 for 语句 比如我们要求 n 2 n 2 n2 的值的列表 其中 n n
  • Python 使用 shuffle() 乱序排列/打乱序列/打乱列表

    在 Python 中 列表和元组中的元素是有顺序的 但是由于元组不可变 所以一般我们涉及到打乱操作 都是针对的列表 在深度学习中 由于原始训练数据可能存在顺序性 当我们分批成 mini batch 进行学习的时候 后面的数据会对系数影响更大
  • day02-08 python基础语法

    模块一 python基础语法 day2 快速上手 今日概要 课程目标 学习Python最基础的语法知识 可以用代码快速实现一些简单的功能 课程概要 初识编码 密码本 编程初体验 输出 初识数据类型 变量 注释 输入 条件语句 1 编码 密码
  • Python Pandas 行数据筛选方法汇总

    Pandas 行数据筛选 一 准备数据 二 通过逻辑规则筛选 大于 小于等 三 删除重复元素 三 显示最前面 最后面的 n 行 3 1 显示前面 n 行 3 2 显示后面 n 行 四 随机抽取 4 1 随机抽取一定比例 4 2 随机抽取 n
  • day24第三阶段总结

    day24 三阶段总结 课程目标 对第三模块 阶段的知识点进行总结和考试 更好的掌握此模块的相关知识 课程概要 知识补充 阶段总结 思维导图 考试题 1 知识点补充 1 1 并发编程 网络编程 从知识点的角度来看 本身两者其实没有什么关系
  • -day25--mysql入门

    第四模块 MySQL数据库 数据库管理系统 DBMS 专注于帮助开发者解决数据存储的问题 这样开发者就可以把主要精力放在实现业务功能上了 业内有很多的的数据库管理系统产品 例如 MySQL 原来是sun公司 后来被甲骨文收购 现在互联网企业
  • -day17 面向对象基础

    第三模块 面向对象 网络 并发编程 此模块包含如下三大部分知识 面向对象 Python中支持两种编程方式来写代码 分别是 函数式编程 面向对象式编程 函数式 定义函数 在函数中实现功能 def func print 一个功能 执行函数 fu
  • -day14--模块与内置模块

    day14 模块 课程目标 掌握Python中常用模块的使用方法 今日概要 自定义模块 包 第三方模块 内置模块 1 2 1 自定义模块 1 1 模块和包 import hashlib def encrypt data 数据加密 hash
  • Python 生成器如何设置和使用

    Python 的生成器其实可以理解为一种比较复杂的迭代器 关于迭代器 可以参考 Python 迭代器的设置和使用方法 一 代码举例 def gen x y txt I love x yield txt txt 1 You love y yi

随机推荐

  • idea显示连接https://start.spring.io连接问题

    表示尴尬 jar包没有打出来 还给我弄了个错误 用spring initializr方式创建一个spring boot项目给我来个 当时就懵逼了 在网上看到说吧https改成http 看了好几种方式 但对我有用的是在idea里的settin
  • flex写Java词法分析_如何用flex+bison写语法分析器

    背景 这个星期 项目中要使用C 或C语言解析JSON格式的数据 把解析的结果放到一个通用的数据结构 这个通用的数据结构 实际上是作为web服务层 这一层大家可以认为是类似于PHP服务器或webpy的服务器容器 到web页面层 这一层是语法类
  • Java使用list集合remove需要注意的事项

    在实际开发中有时候会碰到这样的场景 需要将一个list集合中的某些特定的元素给删除掉 这个时候用可以用List提供的remove方法来实现需求 List中的remove方法传入的参数可以是集合的下标 也可以是集合中一个元素 也可以是一个集合
  • 我的专业我做主ppt计算机,我的专业我做主(会计专业入门知识).ppt

    我的专业我做主 会计专业入门知识 ppt 由会员分享 可在线阅读 更多相关 我的专业我做主 会计专业入门知识 ppt 13页珍藏版 请在装配图网上搜索 1 会计学原理 姓名 池泽周 学院 经济管理学院 班级 会计092班 会计学原理是会计学
  • 对于制造业来说,MES上线前后有哪些变化?

    对于制造业来说 MES软件系统未上线前的现状 具体如下 1 目前 制造业产品的批次记录仍然是手工录入 并且每批都需要去打印 除此之外 生产过程中的投料量计算结果 产品测试的申请单 月生产计划表 产品所需浓度的计算都需要人工填写 不仅需要耗费
  • python包管理-pip

    镜像列表 官方 已默认添加 豆瓣 清华大学 中国科技大学 阿里 网易镜像 腾讯镜像 华为镜像 北京外国语大学 哈尔滨工业大学 百度 https pypi python org simple http pypi doubanio com si
  • 基于爱奇艺HCDN视频分发网络的开放缓存

    为通过Internet向海量用户传输高清晰度 高码率的视频节目 爱奇艺融合CDN和P2P技术 开发出一套适合多终端的混合分发传输网络 HCDN 本文来自爱奇艺高级技术总监庹虎在LiveVideoStackCon 2018大会中的演讲 由Li
  • CTF-8 靶场夺旗

    兵无常势 水无常形 能因敌而致胜者 谓之神 环境准备 VMware Workstation Pro12 Kali Linux IP 10 10 16 128 CTF 8 虚拟机 NAT 网络连接 1 主机发现 fping asg 10 10
  • ubuntu10上安装万能五笔

    我听同事说ubuntu上运行eclipse会比window上快 我抱着好奇就安装了ubuntu来试玩玩 安装完毕 上网找资料的时候 发现我需要中文输入 尤其是五笔 后来返回到window上上网搜索 找到了些资料 知道如何通过ibus来使用拼
  • java泛型里能放多个类吗,具有多个类的Java泛型通配符

    小编典典 实际上 你可以做你想做的事 如果要提供多个接口或一个类加接口 则必须使通配符看起来像这样 请参见sun com上的泛型教程 特别是页面底部的 绑定类型参数 部分 实际上 如果需要 你可以列出多个接口 并 InterfaceName
  • Spring Boot 3.0学习笔记

    什么是Spring Boot Spring Boot是一个基于Spring Framework的快速开发Web应用的工具 它使用了约定优于配置的方式来快速构建应用 使得开发人员能够专注于业务逻辑的实现 而不用过多关注配置和框架集成问题 Sp
  • iostat 工具分析I/O性能

    iostat命令用途 主要用于监控系统设备的IO负载情况 iostat首次运行时显示自系统启动开始的各项统计信息 之后运行iostat将显示自上次运行该命令以后的统计信息 用户可以通过指定统计的次数和时间来获得所需的统计信息 iostat有
  • 若依框架密码验证环节修改(三方登录时改为跳过密码验证,但正常登录保留密码验证)

    当用到三方登录时 例如微信登录等 没法验证密码 又找不到若依密码的解密方式 套用此方法 跳过密码验证 并且为可选的 想让哪个方法登录时要密码或者不要 写上即可 我使用的是若依不分离版 但参考自官方文档 大差不差 具体见个人情况 参考地址 若
  • 【学习笔记】数据获取之爬虫笔记

    概述 疫情期间在风变编程 https www pypypy cn 上学习了爬虫的相关知识 风变编程是一个交互式学习网站 目前开的模块还不是很多但是交互式在线教学实验的形式还是十分有趣 交互式的形式教一个读书顺序 督催一行一行读书 告诉什么时
  • 网页唤起QQ在线聊天

    免费版 详见 https shang qq com v3 widget html 示例 a href http wpa qq com msgrd v 3 uin 1078363295 site qq menu yes 在线客服 a 目前还能
  • 【华师】C++简答题汇总

    简答题 斜体和代码块都是了解即可 面向对象四大特征 封装 抽象 继承 多态 对象 客观世界中的任何一个事物都可以视作一个对象 任何一个对象都己有两个要素 属性和行为 属性是对象本身的性质 而行为是对象的功能 C 中每个对象都是由数据和函数组
  • unity 项目强制退出通知服务器,MonoBehaviour.OnApplicationQuit() 当应用程序退出 - Unity5 中文 API 手册...

    Description 描述 Sent to all game objects before the application is quit 在应用退出之前发送给所有的游戏物体 In the editor this is called wh
  • FTP实现文件夹上传

    package com supcon orchid ChuanHuaCostom util import java io BufferedInputStream import java io BufferedOutputStream imp
  • TCP实现客户端和服务器端连接、文件上传,UDP发送消息、实现多线程在线咨询

    TCP实现客户端和服务器端连接 客户端 连接服务器Socket 发送消息 import java io IOException import java io OutputStream import java net InetAddress
  • python面对对象编程

    什么是面对对象编程 程序设定的范式 面对对象编程可以是代码程序更加的可控更加让人理解 面对对象编程就是把现实世界变得抽象并建立起对象模型 程序就是不同对象之间相互调用的逻辑 例 人 动物 车 这些都是现实世界的东西那就可以在这段代码中抽象出