1.基本概念

Python的面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它使用“对象”来设计应用程序和计算机程序。这些对象由数据和能够操作这些数据的方法组成。面向对象编程的主要目标是提高软件的可重用性、可维护性和灵活性。在Python中,面向对象编程具有以下几个核心概念:

  1. 类(Class)
  • 类是创建对象的模板或蓝图。它定义了一组属性(称为字段或变量),以及操作这些数据的方法。一个类可以包括基本的数据属性(静态的信息片段),以及能够对数据执行特定功能的方法。
  1. 对象(Object)
  • 对象是类的实例。如果类是蓝图,对象就是根据这个蓝图构建的房子。每个对象都拥有类定义的字段和方法的具体实例。即便两个对象来自同一个类,它们也可以拥有不同的数据属性。
  1. 封装(Encapsulation)
  • 封装是面向对象编程的一个主要特点,指的是将对象的数据(属性)和代码(方法)捆绑在一起,形成一个独立的单元。在封装的概念中,类通常会防止外部代码直接访问内部数据结构,而是通过方法(称为getter和setter)来操作数据,这提供了更好的数据控制和更容易的维护。
  1. 继承(Inheritance)
  • 继承允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。子类重用父类的代码可以减少冗余,而且子类可以扩展或修改从父类继承的行为,这提高了代码的可用性和可扩展性。
  1. 多态(Polymorphism)
  • 多态是指同一个接口支持不同的底层形态(数据类型)。在Python中,多态表现为可以通过相同的接口调用不同类的方法,具体调用哪个方法取决于调用方法的对象。比如,不同的类可能都定义了一个相同的方法名,但是每个类的该方法的具体实现可能不同。
  1. 抽象(Abstraction)
  • 抽象是简化复杂的现实问题的方法,它通常用于隐藏复杂度,只显示最相关的细节。在Python中,可以使用抽象类来定义不能直接实例化的类,这些抽象类意在专门为其他类提供基本的、通用的功能模板,具体实现则留给继承了抽象类的子类。

通过使用这些OOP原则,Python程序员能够创建可读性强、易于扩展和维护的应用程序。

2.常用方法及代码实现

  1. 类和对象
#面相对象
#定义一个Foo类,包含两个方法
class Foo:
def bar(self):# bar是Foo类的一个方法,不接受除 self(指向类实例本身的引用)之外的任何参数。当Bar方法调用时它会打印字符串"Cheney"
print("shichengfu")
def Hello(self,name):# Hello是Foo类的另一个方法,接受一个参数name以及隐式的self参数。该方法打印一句格式化字符串,其中包含传入的name参数
print("我的名字是:{}".format(name)) obj = Foo()
obj.bar()
obj.Hello('Shichengfu')
  1. 封装
    下面的代码定义了一个名为 Foo 的类,并且在这个类中封装了两个属性:name 和 age。封装是面向对象编程的一大特性,它主要用于将数据(属性)和与数据相关的方法绑定在一起,形成一个独立的实体(对象),这样的封装可以提高代码的复用性和安全性。
#封装
#定义一个Foo类
class Foo:
def __init__(self,name,age):
self.name = name
self.age = age
Figer1 = Foo("Shichengfu",18)
Figer2 = Foo("Chujiahui",19)
print("Figer1的name为%s"%Figer1.name)
print("Figer2的age为%d"%Figer2.age)
  1. 调用封装的内容
# 封装
class Fool:
def __init__(self,name,age): #初 始化对象属性
self.name = name
self.age = age
def detial(self): #定义一个detial方法
print(self.name)
print(self.age)
obj = Fool("Shichengfu",18) # 实例化一个对象
obj.detial() # 调用detial方法
  1. 继承
    继承是面向对象三大特性之一(另外两个是封装和多态)。继承允许一个类(称为子类)继承另一个类(称为父类或基类)的属性和方法。这样做的主要好处是代码重用,可以将通用的代码放在一个父类中,通过继承机制在多个子类中复用这些代码。
# 继承
class Animal: #定义一个父类
def eat(self):
print("%s 吃"%self.name)
def drink(self):
print("%s 喝"%self.name)
def sleep(self):
print("%s 睡"%self.name) #定义一个子类
class Dog(Animal):
def __init__(self,name):
self.name = name
self.breed = "王怿铭"
def cry(self):
print("汪汪汪")
dog = Dog("王怿铭")
dog.eat()
dog.drink()
dog.cry()
  1. 类的继承机制
    在Python中,类的继承机制允许多重继承,这意味着一个类可以同时继承多个父类。这与Java和C#等其他面向对象的编程语言不同,后者仅支持单一继承,但可以通过接口来实现多继承的某些效果。在Python中,多继承引入了寻找方法和属性的顺序问题,即当一个类继承自多个父类时,Python2.X需要一个明确的规则来决定从哪个父类中寻找方法或属性,这就涉及到深度优先和广度优先的搜索策略。

在Python 2中,有经典类和新式类之分。Python 3中,所有类默认都是新式类(即使不显式继承自 object)。‘即使不显式’通常用于描述某些操作或行为在没有明确指定的情况下依然会发生的情况,这种说法帮助简化代码和提高编程效率,但同时它也要求开发者理解默认行为,以避免意外的错误。

在Python 3中,类的继承和方法解析遵循C3线性化算法。C3线性化是一种特定的算法,用于解决在具有多重继承的类体系中确定方法解析顺序的问题。这个算法确保任何类都会在其父类之前被检查,同时也保持了父类的顺序。这意味着,Python 3中不再单纯使用传统的深度优先或广度优先策略来解析方法调用

  1. 多态
    多态是面向对象编程(OOP)中的一个核心概念,它允许在不同类的对象上以共同的方式调用相同的方法,而具体执行什么方法则取决于调用方法的对象的实际数据类型。这使得编程更加灵活,并增强了代码的可扩展性和可维护性。多态字面意思是“多种形态”,在编程中,它允许使用者以统一的接口处理不同类型的对象。

在下面的例子中,Animal 类定义了一个 speak 方法,Dog 和 Cat 类继承自 Animal 并重写了 speak 方法。函数 animal_sound 接受一个 Animal 类型的对象,并调用它的 speak 方法。当传递 Dog 和 Cat 对象时,尽管 animal_sound 函数的参数类型是 Animal,它依然调用了实际类型对应的方法。

class Animal:
def speak(self):
print("Some sound") class Dog(Animal):
def speak(self):
print("Woof woof") class Cat(Animal):
def speak(self):
print("Meow meow") def animal_sound(animal):
animal.speak() # 调用传入对象的speak方法 # 创建Dog和Cat的实例对象
dog = Dog()
cat = Cat() # 传递不同的对象
animal_sound(dog) # 输出: Woof woof
animal_sound(cat) # 输出: Meow meow

多态是实现开闭原则的关键部分,即软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。这使得在不更改现有代码的情况下,用户可以添加新功能,使系统易于扩展和维护。

Python面相对象的编程的更多相关文章

  1. 019 python面相对象编程

    一:self的意思 1.说明 self代表类的实例,而非类. 类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self. self 代表的是类的实例 ...

  2. python 函数对象(函数式编程 lambda、map、filter、reduce)、闭包(closure)

    1.函数对象 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 秉承着一切皆对象的理念,我们再次回头来看函数(function).函 ...

  3. python面相对象进阶

    1. 类的成员 python 类的成员有三种:字段.方法.属性 字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, 普通字段 属于对象,只有对象创建 ...

  4. Python面相对象之类里面常用的装饰器(3)

    在类里面,可以设置类的全局变量,也就是静态字段,让实例化的所有对都具有该属性 class god: country = 'china'#这个字段在类里面保存,只有一份,叫静态字段,表示每个对象具有的属 ...

  5. 文成小盆友python-num7 -常用模块补充 ,python 牛逼的面相对象

    本篇内容: 常用模块的补充 python面相对象 一.常用模块补充 1.configparser模块 configparser 用于处理特定格式的文件,起内部是调用open()来实现的,他的使用场景是 ...

  6. python 的面相对象编程--对应c++

    在python的面相对象编程中,我们常常在class中可以看到a(),  _b() ,  __c(), __d()__这样的函数. 由于我是看廖雪峰老师的教程,廖老师为了简单起见,没有引入太多概念,我 ...

  7. 关于Python的面相对象编程

    Python 其实不是面向对象的语言,更像是C语言的面向过程编程的语言 但 Python 也支持 class 关键字来实现类的声明与创建 但 Python 的对象更像是 JavaScript 的函数 ...

  8. js编程-面相对象

    //js面相对象编程 //定义constructor构造方法 function myFn(name,sex){ this.name = name; this.sex = sex; } //用proto ...

  9. Python学习day23-面向对象的编程

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  10. 初识python:tkinter 实现 弹球小游戏(非面相对象)

    通过 tkinter 采用非面相对象式实现弹球小游戏(使用蹩脚式面相对象实现). #!/user/bin env python # author:Simple-Sir # time:2020/8/3 ...

随机推荐

  1. 【解决】ValueError: Memory growth cannot differ between GPU devices

    在ubuntu系统下双显卡运行TensorFlow代码报错: ValueError: Memory growth cannot differ between GPU devices 报错的代码位置为: ...

  2. 解决CGLib动态代理测试不通过-Unable to load cache item

    1.背景 在学习aop底层时遇到的问题,做个小结 2.现象 动态代理代码如下: package com.ldp.proxy; import net.sf.cglib.proxy.Enhancer; i ...

  3. 在 React 项目中 Editable Table 的实现

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:佳岚 可编辑表格在数栈产品中是一种比较常见的表单数据交互方 ...

  4. Opentelemetry collector用法

    Opentelemetry collector用法 目录 Opentelemetry collector用法 Service Extensions healthcheckextension Pipel ...

  5. Docker不同宿主机网络打通

    本方式使用docker Swarm集群的方式创建overlay 网络进行打通 背景 因java微服务使用nacos做配置中心,为了解决Nacos服务注册使用Docker容器内网ip问题,使用此方案 前 ...

  6. IE中在线预览PDF文件

    今天在项目中偶然遇到一个需要在线查看pdf的需求.在查阅一些资料之后使用了最简单的写法(需要在客户端安装AdbeRdr11000_zh_CN_11.0.0.379.exe软件). 还有其他方法可以实现 ...

  7. windows服务器使用 azure devops 批量自动发布网站到IIS

    最近由于一个API项目,需要利用负载均衡来做支撑,因此需要将同一份代码分发到多个服务器,之前一直手工干这个活,感觉太累了,去开发交流群,还有搜索了一下资料,发现很多人推荐我用ftp.还有磁盘共享等这种 ...

  8. 爬虫案例1-爬取图片的三种方式之一:DrissionPage篇(3)

    @ 目录 前言 DrissionPage介绍 实战 共勉 博客 前言 继requests篇和selenium篇,本文是爬取图片的最后一个案例,利用了python第三方库DrissionPage来自动化 ...

  9. Mongodb入门4

    今天学习一下MongoDB数据库的索引. 因为养的鱼生病了,所以抽空晚上学习记录一下. 这里借用一下菜鸟教程的原文: 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描 ...

  10. CSS – Tailwind CSS

    前言 很多时候 CSS 未必是需要管理的, 比如做网站, Landing Page (类似宣传单). 很多时候做了 > 用了 > 丢 > 再做新的. 它没有 "维护&quo ...