面对对象基础
面对对象基础一
主要内容:
- 面向对象的概念
- 与面向过程的对比
- 类与对象的关系
- 创建类的方法
- 初始化类的方法
- 类里的方法
1. 面向对象的概念
看到这个概念,就想要提出经典三问之一, 什么是面向对象?那怎么理解面向对象呢?
面向对象其实是一种编程思想,它是由先辈们一步步探索并总结出来的比较适合现在的大型复杂的项目的好的编程方法,运用面向对象的思维,它能指导我们写出可维护性可扩展性更好的程序.
面向对象的核心思想就是以每个对象为核心,把几乎所有的操作都交给对象来做,我们程序员现在只需要通过调度对象的方法及其属性来完成我们想要完成的功能. 相当于把程序员从一个员工的位置上升到老板的位置,只需要指挥能够胜任自己工作的对象来干活,而不用再升入底层,自己一步步的实现所有功能.
2. 与面向过程的对比
面向过程是一种经典且传统的编程思想,它是一种流水线式的编程,相当于把一个复杂的任务拆分成一个个小的子任务,从而让任务简单化,流程化.面向过程的思维方式十分符合人的思考过程, 因此编写面向过程的程序会比较简单, 只需要知道每一步需要干什么就好了.
而面向对象编程则需要先抽象出我们需要的对象的共同特征, 也就是需要先进行设计, 再把对象的方法和属性封装到一个类中.
总结一下这两者的优缺点:
面向过程:
优点: 解决复杂问题简单化,流程化,编程过程相对容易
缺点: 扩展性极差, 牵一发而动全身, 当需要添加功能时, 可能需要更改所有代码.
面向对象:
优点: 扩展性好,可维护性好,每一个类都是独立的,代码复用性也非常好
缺点: 设计难度增大, 把问题变复杂了,且对结果的掌控性变差了,很多时候并不能精确知道每一个对象的结果.
有了上述优缺点的分析,可以看出面向过程主要需要用在那些对扩展性要求不高的场景,例如操作系统内核,各种硬件的驱动等等...而面向对象则主要用在面向用户这一类的程序当中,比如网站,通讯软件等等,用户的需求永远都是一直在变的.
3. 类与对象的关系
在现实生活中,是我们一个个真实存在的对象聚集在一块,然后由我们人类抽象出这些对象的共同特征, 然后分类,简而言之,类可以理解为类型, 对象是属于类型,两者属于包含关系. 而在程序中, 则需要我们先创建类, 然后我们再由这些类实例出一个个对象来使用.
4. 创建类的方法
>>> class Foo: ... pass ... >>> f = Foo() >>> f.name = 'aaa' >>> f.name 'aaa' >>> g = Foo() >>> g.name = 'bbb' >>> g.name 'bbb'
在Python中创建类需要使用class关键字, 后面跟类名,接着缩进,然后跟属于类的代码. 我们通过类名加括号的方式定义对象,然后通过变量名接收.
类里面可以定义属性和方法,类里定义的属性和方法属于所有对象共有的特征,定义的每一个对象都可以访问他们,当对象自己拥有的属性和类里的属性重名的时候,会优先找自己的属性, 找不到才会往类里找.
对象属性的增删改查:
增: 可以通过对象.属性直接给对象添加属性,这也是Python中比较强大的特性,可以动态的为对象添加属性
删: 可以通过del 对象.属性来实现删除对象的属性
改: 和增一样,对象存在该属性则视为添加,否则视为改
查: 直接通过对象.属性查看具体属性. 还可以通过对象.__dict__方法查看属于对象的所有属性.
5. 初始化对象的方法
我们可以在定义完对象后,给对象动态的添加属性, 但是这样就非常麻烦, 我们需要寻找一种能够初始化每个对象都有的但是都不同的属性的一个方法,最容易想到的方法就是在全局定义一个函数, 让后把对象和参数传进去,然后为对象动态的添加属性,但是这样的方法非常的麻烦,需要为每一个对象都传一次, 所以官方存在一个双下init方法,能够让我们在定义对象的时候,就给对象初始化完毕,能够把该添加的属性添加进去. 方法如下所示
class Student(object):
def __init__(self, name):
self.name = name
def say_hello(self):
print('Hi, everyone, I am {}'.format(self.name))
s = Student('jerry')
s.say_hello()
# out: Hi, everyone, I am jerry
6. 类里的方法
类里有3种形式的方法
1: 直接给对象绑定的方法.而默认情况下,类里的方法都是给对象绑定的, 这样的函数第一个参数都是默认传递自己这个对象的,
就如上面这个例子, 我们只需要通过调用对象.方法名,然后不用主动添加自己这个参数就能实现调用这种类型的方法,但是这种给对象绑定的方法也可通过类名.方法名调用,然后传递指定对象, 就可以达到想通过结果.
class Student(object):
def __init__(self, name):
self.name = name
def say_hello(self):
print('Hi, everyone, I am {}'.format(self.name))
s = Student('jerry')
s.say_hello()
Student.say_hello(s)
# Hi, everyone, I am jerry
# Hi, everyone, I am jerry
2: 给类绑定的方法: 类方法
这种方法需要加类装饰器, 然后可以直接通过类名.方法名调用而不用先实例出一个对象,这个方法是属于类的. 如下所示
class Student(object):
school = 'xxx_school'
def __init__(self, name):
self.name = name
@classmethod
def get_school(cls):
print(cls.school)
print(Student.get_school())
# xxx_school
3. 不属于对象和类的静态方法.
这类方法需要加静态装饰器,让类里的函数直接变成普通的静态函数,这样就不与类相关了, 和定义在类外面的函数没有任何区别.
静态方法用的比较少, 一般可以把函数直接定义在外面.

浙公网安备 33010602011771号