1.概念

2.类的定义

3.类的实例化

4.类和实例的属性

5.类的私有变量

6.数据封装

7.继承

8.多态

 

1.面向对象(Object Oriented,OO)概念
    面向对象,是我们编程的一种思维。
    早期的计算机编程是基于面向过程的方法,就针对某一个特定的问题,设计出一个具体的解决步骤,然后计算机根据具体的步骤,得出具体的答案,这个就是面向过程编程的。例如实现算术运算1+1+2 = 4
    随着计算机技术的不断提高,计算机被用于解决越来越复杂的问题,面向过程的编程方式,不能满足我们的需求了。面向对象编程,通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承等。
    通过面向对象的方法,提高了系统的可维护性,可扩展性,可重用性。更利于用人理解的方式,对复杂系统进行分析、设计与编程。
    (就是使编程的思维,更接近与人的思维和认知)


面向对象编程的关键,就是类的定义。
类是对现实生活中一类具有共同特征的事物的抽象。
(简单的说,类就是把具有相同特征的事物,划分为一类)
2.类的定义
基本形式:
    class ClassName(object):
        Statement
      
1.class定义类的关键字
2.ClassName类名,类名的每个单词的首字母大写(驼峰规则)。
3.object是父类名,object是一切类的基类。在python3中如果继承类是基类可以省略不写。
'''
重点:学会定义类,了解属性和方法,类的初始化和实例化。
定义类时,这种方法可以使类对象实例按某种特定的模式生产出来。
'''
#类方法:
'''
后面的参数中第一个参数我们约定俗成的为self参数名,
self代表的是在类实例化后这个实例对象本身。

初始化函数除了有self这个参数表示实例对象本身之外,
其他的参数的定义也遵循函数的必备参数和默认参数一样的原则,
必备参数就是在实例化是一定要传入的参数,
默认参数就是在定义时可以给这个参数一个初始值。没有函数名的函数
'''
3.类的实例化
 基本形式:实例对象名 = 类名(参数)

    在实例化的过程中,self代表的就是这个实例对象自己。

    实例化时会把类名后面接的参数传进去赋值给实例,
    这样传进去的参数就成为了这个实例对象的属性。

    实例化的过程遵循函数调用的原则。
    在实例化时也必须个数和顺序与定义时相同(使用关键字参数可以改变传参的顺序)。
    当初始化函数定义时使用了默认参数时,在实例化时默认参数可以不传参这时
    这个实例对象就会使用默认的属性,如果传了参数进去则会改变这参数值,
    使实例化对象的属性就为你传进来的这个参数。

    isinstance(实例名,类名)
    判断一个实例是不是这个类的实例。
4.类和实例的属性
 类属性
        .类属性是可以直接通过“类名.属性名”来访问和修改。
        .类属性是这个类的所有实例对象所共有的属性,
        任意一个实例对象都可以访问并修改这个属性(私有隐藏除外)。
        .对类属性的修改,遵循基本数据类型的特性:列表可以直接修改,字符串不可以,
        所以当类属性是一个列表时,通过任意一个实例对象对其进行修改。
        但字符串类型的类属性不能通过实例对象对其进行修改。
        当实例对不可变对象进行修改之后,会查找实例的类属性,不会查找类的属性,同时类的属性不会边
    
    实例属性
        .在属性前面加了self标识的属性为实例的属性。
        .在定义的时候用的self加属性名字的形式,在查看实例的属性时
        就是通过实例的名称+‘.’+属性名来访问实例属性。
    一些说明:
        .一般,方法第一个参数被命名为self,,这仅仅是一个约定,
        self没有特殊含义,程序员遵循这个约定。
        .查看类中的属性和实例属性可以调用__dict__方法返回属性组成的字典。
        .Python中属性的获取是按照从下到上的顺序来查找属性
        .Python中的类和实例是两个完全独立的对象
        .Python中的属性设置是针对对象本身进行的
5.类的私有属性和方法
    对于Python中的类属性,可以通过双下划线”__”来实现一定程度的私有化。
    _”和” __”的使用 更多的是一种规范/约定,不没有真正达到限制的目的:
    “_”:以单下划线开头只能允许其本身与子类进行访问,(起到一个保护的作用)
    “__”:双下划线的表示的是私有类型的变量。这类属性在运行时属性名会加上单下划线和类名。
    “__foo__”:以双下划线开头和结尾的(__foo__)代表python里特殊方法专用的标识,如 __init__()
6.数据封装
在类里面数据属性和行为用函数的形式封装起来,
访问时直接调用,不需知道类里面具体的实现方法。 比如,list.append
7.继承
用法:
    .在定义类时,可以从已有的类继承,
    被继承的类称为基类(父类),新定义的类称为派生类(子类)。
    
    .在类中找不到调用的属性时就搜索基类,
     如果基类是从别的类派生而来,这个规则会递归的应用上去。
     反过来不行。
    
    .如果派生类中的属性与基类属性重名,那么派生类的属性会覆盖掉基类的属性。
     包括初始化函数。
    
    .派生类在初始化函数中需要继承和修改初始化过程,
     使用’类名+__init__(arg)’来实现继承和私有特性,也可以使用super()函数。
    
    issubclass(类名1,类名2)
    判断类1是否继承了类2
    
作用:
    面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。
    继承完全可以理解成类之间的类型和子类型关系。
    
    子类在重写父类方法之后,如果要继承父类方法中的功能,要先调用父类的方法  class.fun(self)

8.多态

多态,按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。

(简单的说,不同类的对象,接受到同一条指令,可以做出不同的反应。)

例如: 当派生类,重写了基类的方法时就实现了多态性。(子类重写父类方法)

 

 9:作业

2.定义一个矩形的类:
要求:1.有长和宽的属性
2.有一个计算面积的方法
class rectangle(object): #定义矩形的类
def __init__(self,length,wide): #类属性
self.length = length
self.wide = wide

length = int(input('请输入长:'))
wide = int(input('请输入宽:'))
area = rectangle('length','wide')
area = length*wide
print('面积=%d'%area)

# 3.写一个正方形的类,继承矩形类
# 要求:有一个判断是不是正方形的方法
class rectangle(object): #定义矩形的类
def __init__(self,length,wide): #类属性
self.length = length
self.wide = wide
length = int(input('请输入长:'))
wide = int(input('请输入宽:'))
class square(rectangle): #定义正方形的类
def square(self):
if self.length == self.wide: #判断是否是正方形
return ("这是一个正方形")
else:
return ("这不是一个正方形")
a = square(length,wide)
print(a.square())