面向对象_Object-Oriented Programing(OOP)

Posted linghuang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象_Object-Oriented Programing(OOP)相关的知识,希望对你有一定的参考价值。

面向过程编程
把计算机程序视为一系列的命令集合,即一组函数的顺序执行(把大块函数通过切割成小块函数来降低系统的复杂度)

面向对象编程 Object-Oriented Programing OOP
把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息并处理消息
计算机程序的执行就是一系列消息在各个对象之间传递

什么是对象:
对象是指现实中的物体或实体

对象的特征:
1.对象有很多属性(名词或形容词)
年龄,姓名,性别
2.对象有很多行为(动作,动词)
学习,吃饭,睡觉,踢球,工作

什么是面向对象:
把一切看成对象(实例),用各种对象之间的关系来描述事务
重要概念:类(class)和实例(Instance),类是抽象的模板,比如Student类,而实例是
根据类创建出来的一个个具体的‘对象‘,每个对象都拥有相同的方法,但各自的数据可能不同

面向对象的三大特点:
封装、继承、多态

什么是类:
1.拥有相同属性和行为的对象分为一组,即是一个类
2.类是用来描述对象的工具,用类可以创建此类的对象(实例)
3.类就是一种定义新种类的东西的方式,它反映了在程序领域中的真实对象

类的创建语句 class语句
语法:
class 类名(继承列表(object)): #类名通常是大写开头的单词,(继承列表(object)表示该类从那个类继承下来的)
‘‘‘类文档字符串‘‘‘
类的__slots__列表
实例方法定义
类变量定义
类方法定义(@classmethod)
静态方法定义(@staticmethod)
作用:
创建一个类
类用于描述对象的行为和属性
类用于创建此类的一个或多个对象(实例)

说明:
    类名必须为标志符(与变量名命名规则相同,建议首字母大写)
    类名实质上就是变量,它绑定一个类

类的文档字符串:
类内第一个没有赋值给任何变量的字符串为类的文档字符串
类的文档字符串可以通过help()函数来查看
类的文档字符串绑定在类的__doc__属性上

类的__slots__列表
作用:
限定一个类创建的实例只能有固定的属性(实例变量)
不允许对象添加列表以外的实例属性(实例变量)
防止用于因错误写属性名而发生程序错误
说明:
__slots__属性绑定一个字符串列表
含有__slots__属性的类所创建的实例对象没有__dict__属性
即此实例不用字典来存储对象的实例属性
示例:见

初始化方法__init__():
作用:
对新创建的对象添加属性
语法格式:
class 类名(继承列表)
def init(self,[形参列表]): #第一个参数永远是self,表示创建的实例本身
语句块
注:[]代表其中的内容可以省略
说明:
1.初始化方法名必须为 ‘init‘ 不可改变
2.初始化方法会在构造函数创建实例后自动调用,
3.在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,
但self不需要传,Python解释器自己会把实例变量传进去
(即实例自身通过参数self传入__init__方法(每个与类相关联的方法调用都自动传递实参self,
它是一个指向实例本身的引用,让实例能够访问类中的属性和方法))
3.构造函数的实参将通过
__init__方法的参数列表传入到 __init__方法中
4.初始化方法内如果需要return 语句返回,则只能返回None

析构方法:
class 类名(继承列表):
def del(self):
语句块
析构方法在对象被销毁时被自动调用
python语言建议不要在对象销毁时做任何事情,因为销毁时间难以确定

实例方法(method)
语法:
class 类名(继承列表):
def 实例方法名(self,形参名,形参名2,...):
‘方法文档字符串‘
语句块

作用:
    用于描述一个对象的行为,让此类型的全部对象都拥有相同的行为

说明:
    实例方法的实质是函数,是定义在类内的函数
    实例方法至少有一个形参,第一个形参用来绑定调用这个方法的实例,
        一般命名为‘self‘
        
实例方法的调用语句:
    实例.实例方法(调用传参)
    #或
    类名.实例方法名(实例,调用传参)

实例属性 attrribute(也叫实例变量)
每个实例可以有自己的变量用来保存对象自己的数据,称为实例变量(也叫属性)

语法:
    实例.属性名

赋值规则同变量的赋值规则
    首次为属性赋值则创建此属性
    再次属性赋值则改变属性的绑定关系
作用:
    记录每个对象自身的数据

构造函数:
构造函数调用表达式:
类名([创建传参列表])

作用:
    创建这个类的实例对象,并返回此实例对象的引用关系
说明: 
    实例有自己的作用域和名字空间,可以为该实例添加实例变量(也叫属性)
    实例可以调用类方法和实例方法
    实例可以访问类变量和实例变量

类变量:
类变量是类的属性,此属性属于类,不属于此类的实例

作用:
    通常用来存储该类创建对象的共有属性

说明:
    类变量可以通过该类直接访问
    类变量可以通过类的实例直接访问
    类变量可以通过此类的对象的__class__属性间接访问
    
示例:见

类方法 @classmethod
类方法是用于描述类的行为的方法,类方法属于类,不属于类的实例对象

说明:
    1.类方法需要使用@classmethod装饰器定义
    2.类方法至少有一个形参,第一个形参用于绑定类,约定写为‘cls‘
    3.类和该类的实例都可以调用类方法
    4.类方法不能访问此类创建的对象的实例属性

静态方法 @staticmethod
静态方法是定义在类的内部的函数,此函数的作用域是类的内部

说明:
    静态方法需要使用@staticmethod装饰器来定义
    静态方法与普通函数定义相同,不需要传入self实例参数和cls类参数
    静态方法只能凭借该类或类创建的实例调用
    静态方法不能访问类变量和实例变量
示例:见

del 语句:
可以删除对象(实例)的属性
语法:
del 对象.实例变量名
示例:
class Dog:
pass
dog1 = Dog()
dog1.color = ‘白色‘
del dog1.color
print(dog1.color) AttributeError错误

del小结:
    1.删除变量      del name
    2.删除列表的元素   del L[1] /  del L[::2]
    3.删除字典的键        del d[‘name‘]
    4.删除对象的属性   del dog1.color
        

预置实例属性
__dict__属性
__dict__属性绑定一个存储此实例自身变量字典

示例:
    class Dog:
        pass
        
    dog1 = Dog()
    print(dog1.__dict__)    #{}
    
    dog1.color = ‘白色‘
    print(dog1.__dict__)    #{‘color‘:‘白色‘}
    
    dog1.kinds = ‘京巴‘
    print(dog1.__dict__)    #{‘color‘:‘白色‘,‘kinds‘:‘京巴‘}
    
    
__class__属性
    ‘__class__‘ 属性绑定创建此实例的类
    作用:
        可以借助此属性来访问创建此实例的类
    示例:
    class Dog:
        pass
        
    dog1 = Dog()
    print(dog1.__class__)   #
    
    dog2 = dog1.__class__()
    print(dog2.__class__)

用于类的函数:(isinstance/type)
isinstance(obj,class_or_tuple)
返回这个对象obj是否是某个类的对象或者某些类中的一个类的对象,
如果是则返回True,否则返回False
type(obj) 返回对象的类型

继承 inheritance 和 派生 deriverd:
什么是继承/派生?
继承是从已有的类中派生出新的类,新类具有原类的数据属性和行为
,并能扩展新的行为
派生类就是从一个已有的类中衍生出新的类,在新类的基础上添加新的属性和行为

为什么继承/派生
    继承的目的是延续旧类的功能
    派生的目的是在旧类的基础上改变原有的功能
名词:
    基类(base class)/超类(super class)/父类(father class)
    派生类(deriverd class)/子类(child class)

继承派生机制的作用:
    1.可以将一些共有功能加在基类中,实现代码共享
    2. 在不改变基类的基础上改变原有功能

单继承:
    语法:
        class 类名(基类名):
            语句块
    说明: 
        单继承是指派生类由一个基类衍生出来的新类
    示例见:

继承说明:
    python3任何类都直接或间接的继承自object类
    object类是一切类的超类

类的__base__属性
    __base__属性用来记录此类的基类

python内建的类见:
    help(__builtins__)

覆盖 override (也叫重写父类方法)
什么是覆盖?
覆盖是指在有继承关系的类中,子类中实现了与基类
同名的方法,在子类的实例调用该方法时,实际调用
的是子类中的覆盖版本,这种现象叫覆盖

示例见:

问题:当覆盖发生时,子类对象如何调用父类中的覆盖方法?
    
    调用方式:
        基类名.方法名(实例,实际调用传参)

super函数:
    super(cls,obj) 返回绑定超类的实例(要求obj必须为cls类型的实例)
     
    super() 返回绑定超类的实例,等同于:super(__class__,
        实例方法的第一个参数,必须在方法内调用)
    
    作用:
        借助super()返回实例间接调用父类的覆盖方法

显示调用基类的初始化方法:
    当子类中实现了__init__()方法,基类的构造方法并不会被调用,此时需要显示调用

    示例见:
    

类编码风格
1.你必须熟悉有些与类相关的编码风格问题,在你编写的程序较复杂时尤其如此。
2.类名应采用驼峰命名法 ,即将类名中的每个单词的首字母都大写,而不使用下划线。实例名和模块名都采用小写格式,并在单词之间加上下划
线。
3.对于每个类,都应紧跟在类定义后面包含一个文档字符串。这种文档字符串简要地描述类的功能,并遵循编写函数的文档字符串时采用的格式约
定。每个模块也都应包含一个文档字符串,对其中的类可用于做什么进行描述。
4.可使用空行来组织代码,但不要滥用。在类中,可使用一个空行来分隔方法;而在模块中,可使用两个空行来分隔类。
5.需要同时导入标准库中的模块和你编写的模块时,先编写导入标准库模块的import 语句,再添加一个空行,然后编写导入你自己编写的模块的
import 语句。在包含多条import 语句的程序中,这种做法让人更容易明白程序使用的各个模块都来自何方。









































































































以上是关于面向对象_Object-Oriented Programing(OOP)的主要内容,如果未能解决你的问题,请参考以下文章

面向对象--OO--object-oriented

javaScript设计模式之面向对象编程(object-oriented programming,OOP)

面向对象的程序设计:Object-oriented programming

javaScript设计模式之面向对象编程(object-oriented programming,OOP)(二)

python经典书籍推荐:Python面向对象编程指南 : Mastering Object-oriented

面向对象编程导论 An Introduction to Object-Oriented Programming