面对对象编程

guducp guducp     2022-11-16     667

关键词:

面向对象编程

标签(空格分隔): python 基础

---

面向过程:根据业务逻辑从上到下写代码
面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程

面向对象(object-oriented ;简称: OO) 至今还没有统一的概念 我这里把它定义为: 按人们 认识客观世界的系统思维方式,采用基于对象(实体) 的概念建立模型,模拟客观世界分析、设 计、实现软件的办法。

面向对象编程(Object Oriented Programming-OOP) 是一种解决软件复用的设计和编程方法。 这种方法把软件系统中相近相似的操作逻辑和操作 应用数据、状态,以类的型式描述出来,以对象实例的形式在软件系统中复用,以达到提高软件开发效率的作用。


面向对象编程的2个非常重要的概念:类和对象

对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念——类

#类
人以类聚 物以群分。
具有相似内部状态和运动规律的实体的集合(或统称为抽象)。
具有相同属性和行为事物的统称
类就是创建对象的模板
#对象
某一个具体事物的存在 ,在现实世界中可以是看得见摸得着的。
可以是直接使用的

#python中的类
类(Class) 由3个部分构成
类的名称:类名
类的属性:一组数据
类的方法:允许对进行操作的方法 (行为)

定义一个类,格式如下:

class 类名:
方法列表
demo:定义一个Hero类

# class Hero: # 经典类(旧式类)定义形式
# class Hero():

class Hero(object): # 新式类定义形式
def info(self):
print("英雄各有见,何必问出处。")

定义类时有2种形式:新式类和经典类,上面代码中的Hero为新式类,前两行注释部分则为经典类;

object 是Python 里所有类的最顶级父类;

类名 的命名规则按照"大驼峰命名法";

info 是一个实例方法,第一个参数一般是self,表示实例对象本身,当然了可以将self换为其它的名字,其作用是一个变量 这个变量指向了实例对象

python中,可以根据已经定义的类去创建出一个或多个对象。

创建对象的格式为:

对象名1 = 类名()
对象名2 = 类名()
对象名3 = 类名()
#__init__方法
创建对象后再去添加属性有点不合适,有没有简单的办法,可以在创建对象的时候,就已经拥有这些属性?
__init__()方法,在创建一个对象时默认被调用,不需要手动调用
__init__(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递过去。

说明:
通过一个类,可以创建多个对象,就好比 通过一个模具创建多个实体一样

__init__(self)中,默认有1个参数名字为self,如果在创建对象时传递了2个实参,那么__init__(self)中出了self作为第一个形参外还需要2个形参,例如__init__(self,x,y)

注意:
在类内部获取 属性 和 实例方法,通过self获取;
在类外部获取 属性 和 实例方法,通过对象名获取。

如果一个类有多个对象,每个对象的属性是各自保存的,都有各自独立的地址;

但是实例方法是所有对象共享的,只占用一份内存空间。类会通过self来判断是哪个对象调用了实例方法。

#__str__方法
当使用print输出对象的时候,默认打印对象的内存地址。如果类定义了__str__(self)方法,那么就会打印从在这个方法中 return 的数据
__str__方法通常返回一个字符串,作为这个对象的描述信息
#__del__
当删除对象时,python解释器也会默认调用一个方法,这个方法为__del__()方法
当有变量保存了一个对象的引用时,此对象的引用计数就会加1;

当使用del() 删除变量指向的对象时,则会减少对象的引用计数。如果对象的引用计数不为1,那么会让这个对象的引用计数减1,当对象的引用计数为0的时候,则对象才会被真正删除(内存被回收)。

#继承
在程序中,继承描述的是多个类之间的所属关系。
如果一个类A里面的属性和方法可以复用,则可以通过继承的方式,传递到类B里。
那么类A就是基类,也叫做父类;类B就是派生类,也叫做子类。
#单继承
子类只继承一个父类就叫做单继承
#多继承
多继承可以继承多个父类,也继承了所有父类的属性和方法
注意:如果多个父类中有同名的 属性和方法,则默认使用第一个父类的属性和方法(根据类的魔法属性mro的顺序来查找)
多个父类中,不重名的属性和方法,不会有任何影响。
#子类重写父类的属性和方法
如果在子类中有和父类同名的属性或者方法那么,叫做子类重写父类的属性和方法,调用时默认使用子类的的属性和方法。
#多层继承
孙类继承子类,可以使用父类的方法和属性这叫做多层继承
#super方法调用父类的方法
子类继承了多个父类,如果父类类名修改了,那么子类也要涉及多次修改。而且需要重复写多次调用,显得代码臃肿。

使用super() 可以逐一调用所有的父类方法,并且只执行一次。调用顺序遵循 mro 类属性的顺序。

注意:如果继承了多个父类,且父类都有同名方法,则默认只执行第一个父类的(同名方法只执行一次,目前super()不支持执行多个父类的同名方法)

super() 在Python2.3之后才有的机制,用于通常单继承的多层继承。
#面向对象三大特性:封装、继承、多态
封装的意义:
将属性和方法放到一起做为一个整体,然后通过实例化对象来处理;
隐藏内部实现细节,只需要和对象及其属性和方法交互就可以了;
对类的属性和方法增加 访问权限控制。
私有权限:在属性名和方法名 前面 加上两个下划线 __
类的私有属性 和 私有方法,都不能通过对象直接访问,但是可以在本类内部访问;
类的私有属性 和 私有方法,都不会被子类继承,子类也无法访问;
私有属性 和 私有方法 往往用来处理类的内部事情,不通过对象处理,起到安全作用。
私有属性可以其实在类外部是可以访问的但是这个违背原本的设计初衷,所以这边具体访问的方法就不写出来了,python是通过重写属性名来实现类外不可访问的。
Python是以属性命名方式来区分,如果在属性和方法名前面加了2个下划线‘__‘,则表明该属性和方法是私有权限,否则为公有权限。
#修改私有属性的值
私有属性不能直接访问,所以无法通过第一种方式修改,一般的通过第二种方式修改私有属性的值:定义一个可以调用的公有方法,在这个公有方法内访问修改。
一般我们会定义这个属性的get方法和set方法
get方法用来获取到属性,set方法用来修改属性。
#多态
所谓多态:定义时的类型和运行时的类型不一样,此时就成为多态 ,多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型”。

鸭子类型:虽然我想要一只"鸭子",但是你给了我一只鸟。 但是只要这只鸟走路像鸭子,叫起来像鸭子,游泳也像鸭子,我就认为这是鸭子。

Python的多态,就是弱化类型,重点在于对象参数是否有指定的属性和方法,如果有就认定合适,而不关心对象的类型是否正确。
#类属性和实例属性
在了解了类基本的东西之后,下面看一下python中这几个概念的区别

先来谈一下类属性和实例属性

在前面的例子中我们接触到的就是实例属性(对象属性),顾名思义,类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,这个和C++中类的静态成员变量有点类似。对于公有的类属性,在类外可以通过类对象和实例对象访问

如果需要在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性。
# 类方法
是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以‘cls‘作为第一个参数的名字,就最好用‘cls‘了),能够通过实例对象和类对象去访问。
#静态方法
需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数,可以通过对象和类来访问。
总结
从类方法和实例方法以及静态方法的定义形式就可以看出来,类方法的第一个参数是类对象cls,那么通过cls引用的必定是类对象的属性和方法;
实例方法的第一个参数是实例对象self,那么通过self引用的可能是类属性、也有可能是实例属性(这个需要具体分析),不过在存在相同名称的类属性和实例属性的情况下,实例属性优先级更高。
静态方法中不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过类实例对象来引用
#__new__方法
__new__方法在创建对象之前执行
__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供

__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例

__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值

我们可以将类比作制造商,__new__方法就是前期的原材料购买环节,__init__方法就是在有原材料的基础上,加工,初始化商品环节

#单列模式
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。
实例化一个单例

class Singleton(object):
__instance = None

def __new__(cls, age, name):
#如果类属性__instance的值为None,
#那么就创建一个对象,并且赋值为这个对象的引用,保证下次调用这个方法时
#能够知道之前已经创建过对象了,这样就保证了只有1个对象
if not cls.__instance:
cls.__instance = object.__new__(cls)
return cls.__instance

面对对象编程

面向对象编程标签(空格分隔):python基础---面向过程:根据业务逻辑从上到下写代码面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程面向对象(object-oriented;简称:OO)至今... 查看详情

19-面对对象编程

Object-orientedprogramming面向对象编程Object-orienteddesign面向对象设计类的定义面向对象编程和函数式编程的区别类的传参类的定义?类是一个抽象的概念,任何东西都可以是一个类,比如,苹果是一个类,香蕉是一个类,动物又是一个... 查看详情

javascript面对对象编程之继承

     上一篇博客中为大家介绍了javascript面向对象编程原则的封装,今天为大家介绍继承。在javascript中没有类的概念,全部不能像c#。java语言那样。直接的用类去继承类。比方如今有比方。如今有一个"动物&... 查看详情

day-8:面对对象编程

  面对过程的程序设计方法意在将函数分成子函数,再依次调用这些函数来解决问题。  而面对对象的程序设计方法,来源于自然界,类是实例的抽象,实例是类的具体。自定义出来的对象是类,而所有的数据都可以看成是... 查看详情

day-9:面对对象高级编程

  数据封装、继承和多态只是面向对象编程中最基础的3个概念。  下面整理面向对象高级编程的更为强大的技巧。  使用__slots__:Python属于动态语言,可以允许已创建好的类动态地绑定任何属性和方法。但是,给实例绑... 查看详情

面对对象基础

1.面对对象不是所有情形都适用  1.1函数式编程deffun1(arg1):passdeffun2(arg1,arg2):passfun1("acker")fun2("...")  2.1面对对象编程classhumanBeing:deffun1(self,arg1):passdeffun2(self,arg1,arg2):passobj1=humanBeing()obj1.fun1(‘wuwe 查看详情

面对对象编程--类继承(代码片段)

类(Class): 用来描述具有相同的属性和方法的对象的集合。对象,实例:通过类实例化出来的东西属性:类里面的变量方法:类里面的方法实例方法:正常定义的带self函数都是实例方法类方法:  1、不实例化,直接用类名调... 查看详情

python面对对象高级编程(代码片段)

文章目录一、使用`__slots__`二、使用装饰器——@property三、多重继承(多继承)四、定制类`__str__``__iter__``__getitem__``__getattr__``__call__`五、使用枚举类六、使用元类type()扩展——met 查看详情

基于java面对对象编程范式

科学思维&工程思维科学思维:限制条件可有可无,理论可行寻求未解决问题转变为解决问题的最优解;工程思维:限制条件多,现实可行性下寻求折中方案,不坏的解。 软件工程的发展历史:数学-计算机问题 计算机... 查看详情

python支持面向对象吗?

面向过程和面对对象是一种编程思想,不能说某某语言是不是面对对象或是面向过程,而是某某语言是否支持面对对象或面向过程。回归主题,python可以支持面对对象,但也可以支持面向过程,即使不支持面向对象的语言,比如... 查看详情

[python]两种编程思维--面向过程和面向对象

...然后告诉机器人做一道西红柿炒鸡蛋。在这里,我们直接面对的是机器人,而非炒菜的过程,所以这里机器人就是我们面对的对象,这种解决问题的方法就叫做【面向对象】编程三、总结【面向过程】编程主要用到的是“函... 查看详情

6月6日面对对象复习

 面对对象编程核心是对象二字,是一种上帝式的思维,它的优点是解决了程序的扩展性问题。类有两种属性:数据属性和函数属性三大特性:继承,封装,多态多态:python崇尚鸭子类型 封装:将属性隐藏起来,对内开放... 查看详情

java阶段五之面对对象应用(代码片段)

面对对象应用常用APIString类关于String为啥不可改变StringBuilder类String、StringBuffer和StringBuilder的区别:ArrayList1.1ArrayList类概述1.2ArrayList类常用方法学生管理系统常用APIAPI理解什么是API  API(ApplicationProgrammingInterface):应用程序编... 查看详情

面对对象一

了解什么是面对对象oop看看什么是OOP,ObjectOrientedProgramming,原来就是面向对象的编程啊,还有OOD(面向对象的设计),OOA(面向对象的分析)。那什么是面向对象呢?要想了解这个问题我们要先了解面向过程,这样对比我们就... 查看详情

状态机编程思维学习笔记(c语言)(代码片段)

前言不摸鱼摆烂的第一天目录前言C语言面对对象特性引入函数指针结构体中套用函数指针宏定义中##纯替换状态机概念状态机实现后文C语言面对对象特性引入众所周知,C++是由C语言编写而成,因此,C语言也可... 查看详情

状态机编程思维学习笔记(c语言)(代码片段)

前言不摸鱼摆烂的第一天目录前言C语言面对对象特性引入函数指针结构体中套用函数指针宏定义中##纯替换状态机概念状态机实现后文C语言面对对象特性引入众所周知,C++是由C语言编写而成,因此,C语言也可... 查看详情

状态机编程思维学习笔记(c语言)(代码片段)

前言不摸鱼摆烂的第一天目录前言C语言面对对象特性引入函数指针结构体中套用函数指针宏定义中##纯替换状态机概念状态机实现后文C语言面对对象特性引入众所周知,C++是由C语言编写而成,因此,C语言也可... 查看详情

面向对象

...对象,以及对象之间的互相调用完成一定的功能,来体现面对对象的编程思想 查看详情