面向对象基础

    技术2025-01-26  9

    面向对象

    什么是面向对象?

    面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。

    前面写过的程序是面向对象吗?

    我们之前已经写了不少小程序,都是按照功能需求的顺序来设计程序。这种被称为“面向过程”的编程。

    类和对象

    面向对象编程最主要的两个概念就是:类(class)和对象(object)。

    类是一种抽象的类型,而对象是这种类型的实例。

    举个现实的例子:“笔”作为一个抽象的概念,可以被看成是一个类。而一支实实在在的笔,则是“笔”这种类型的对象。

    一个类可以有属于它的函数,这种函数被称为类的“方法”。一个类/对象可以有属于它的变量,这种变量被称作“属性”。

    类定义

    类定义:使用class关键字
    class ClassName:
    类运行不像函数了,需要实例化类的对象

    实例化调用

    class demo_class: def__init__(self,name,age) self.name = name self.age = age

    self

    self在类方法中的值,就是你调用的这个对象本身。

    类的属性

    类的属性分为类属性和实例属性,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同,类属性是在类里面定义的,而实例属性是在方法里面定义的。

    class Province: # 类属性 country = "China" def __init__(self, name): # 实例属性 self.name = name obj_henan = Province("HeNan") print(obj_hunan.name) # 使用对象访问实例属性 print(Province.country) # 使用类访问类属性

    由上述代码可以看出【实例属性需要通过对象来访问】【类属性通过类访问】,在使用上可以看出他们的归属是不同的。

    类的方法

    类的方法方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。 普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self; 类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls; 静态方法:由类调用;无默认参数;

    静态方法

    class student(): @staticmethod def print_stu_info(name,technical): print('学生%s,已经就读于本校%s专业'%(name,technical)) student.print_stu_info()

    类方法

    类方法是静态方法的一种特殊形式,自带特殊参数cls,使用装饰器 @classmethod,跟静态方法一样可以通过类名直接调用。

    class Foo: @classmethod def print_info(cls): #cls = class print('学生%s,已经就读于本校%s专业'%(name,technical)) Foo.print_info()

    构造方法

    很多类都倾向于将对象创建为有初始状态的。因此类可能会定义一个名为 init() 的特殊方法(构造方法)。

    类定义了__init__()方法的话,类的实例化操作会自动调用 init() 方法。当然,init()方法可以有参数,参数通过__init__()传递到类的实例化操作上。

    class student(): def __init__(self,name,technical): self.name = name self.technical = technical def print_stu_info(self): print('学生%s,已经就读于本校%s专业' %(self.name,self.technical)) student('Alex','computer').print_stu_info()

    私有化

    私有属性和方法只能在类内部使用,类外部则无法调用。语法则为以两个下划线开头。

    class students: def __init__(self): self.name = '小明' self.__age = 22 #私有属性 self.__red() #私有方法可以在类内部调用 def __red(self):#私有方法 print('%s在读书'%self.name) def ages(self): print('%s今年%d岁了'%(self.name,self.__age))#私有属性在类内部调用 s = students() print(s.name) s.ages()

    私有化属性、和方法在类外面还有可以调用的。其实python中属性、方法的私有化并不是真正意义上的私有化,这只是python耍了一个小聪明,在属性、方法前面加上两个下划线后,在程序解释运行时会在前面自动加一个带下划线的类名。

    特性

    面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。

    面向对象的三大特性是指:封装、继承和多态。

    封装

    封装:即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。

    在使用面向对象的封装特性时,需要:

    将内容封装到某处

    从某处调用被封装的内容

    继承

    面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。

    在Python中,可以让一个类去继承一个类,被继承的类称为父类或者超类、也可以称作基类,继承的类称为子类(派生类)。并且Python支持多继承,能够让一个子类有多个父类。语法如下:

    class DerivedClassName(ClassName)
    继承重写
    class Car: def run(self): print('car is running...') class Benz(Car): def run(self): print('Benz is running...') c = Benz() c.run()

    注意:在继承中子类重写了父类的方法后,想要在子类里继续调用父类的方法用super().method()调用。

    重载

    Python动态数据类型,导致传统面向对象语言中的重载失去了意义,例如:

    class car: def wheels(self,number): print('This car has %s wheels'%number) def wheels(self,number,brand): print('This car has %s %s wheels'%(number,brand))

    从上面的例子中,我们发现:实例化对象根本找不到第一个wheels的方法!

    面向对象的设计和实现

    一、定义和实现 对象 可以直接对应现实世界里面的事物

    二、面向对象的设计(OOD)

    1、分析要解决的现实世界的问题
    2、定义出各种对象 代表现实世界的对象
    3、通过设计 对象之间的关系和交互行为来设计系统

    三、因为

    1、现实世界 其实就是各种对象 和对象之间的关系、交互行为
    2、现实世界:事物的时间

    a、物:对象、对象之间的关系(儿子、父亲;老板、员工)

    b、事:对象之间的交互(司机开车,厨师做饭)

    3、这种设计方式 更容易被人所理解和接受

    类和实例

    1、首先,寻找要设计的对象

    ​ 老虎、羊、房间

    2、接下来,确定对象的定义

    a、对象的定义:定义对象在这个系统里面的的属性和行为
    b、比如老虎这类对象,在这个系统里面的共有属性,行为 属性
    c、在面向对象的软件设计中把对象和它的属性和行为的定义叫 类 的定义
    d、类表示了这类对象所共有的属性和行为
    e、类是面向对象的设计中最基本的概念
    f、定义了类,就定义了对象的类型(包括在系统里面的属性和行为)

    3、实例 是类的具体化存在

    a、老虎这个类,描述了: 1、在这个系统里面共有的属性:体重、名称 2、行为有叫、吃食物 b、每个具体的老虎,是老虎这个类的 实例 房间中老虎 c、类的实例的关系,有点像 模具和根据模具做的东西一样

    面向对象的语言 vs 面向对象的设计

    1、面向对象的设计:是一种设计思路

    2、面向对象的语言:提供对面向对象设计的语言支持

    3、非面向对象的语言也能实现面向对象的设计思路

    静态属性和实例属性

    1、静态属性(类属性) 该类的所有实例共享的属性 2、实例属性 体重(每个实例独有的) 定义在 初始化方法 __init__里 self的概念

    静态方法和实例方法

    1、对象的方法就是描述对象行为的

    a、通过定义在类里面的函数
    b、初始化方法__init__函数

    2、类的方法包括

    a、实例方法:每个具体实例相关的方法
    b、静态方法:共有的方法,每个具体实例都是相同的
    实例方法: 1、与每个具体实例相关的方法 如果代码中的实例方法不访问任何实例属性,一般建议实现为静态方法 2、初始化方法就是一个实例方法 3、一般实例方法都要访问self 静态方法 与每个具体实例无关 @staticmethod 修饰 (装饰器) 静态方法不能访问实例属性,但是可以访问静态属性

    对象的组合

    一、什么是对象的组合?

    1、房间里可以包含老虎、羊
    2、通过 对象的属性 表示这种组合 关系的
    在类定义的 初始化函数 里面表示对象的组合 class Room: def __init__(self,num,animal): self.num = num self.animal = animal

    对象的继承

    现实世界里面的对象

    重定义

    子类的属性和行为跟父类不一样

    子类实例 调用这些属性、方法 会使用新的定义

    多态

    ​ 同样的的方法调用,在不容类型的对象上会表现出不同的特性,称之为多态

    Processed: 0.010, SQL: 9