面向对象

概述

  • 面向过程:根据业务逻辑从上到下写垒代码
  • 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
  • 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 

   在之前已经接触过了面向过程和函数式的编程,还有那么今天我们来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)

创建类和对象

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

  类就是一个模板,模板里可以包含多个函数,函数里实现一些功能(把一类事物的相同特征和动作整合到一起就是类)

  对象则是根据模板创建的实例,通过实例对象可以执行类中的函数(就是基于类而创建的一个具体的事物(具体存在的))

在这里举一个小例子:

创建类

class Foo:

def Bar(self):
    print 'Bar'

def Hello(self, name):
    print 'i am %s' %name

根据类Foo创建对象obj

obj = Foo() obj.Bar() #执行Bar方法 obj.Hello('wupeiqi') #执行Hello方法 

创建类

class Foo:

def Bar(self):
    print 'Bar'

def Hello(self, name):
    print 'i am %s' %name

根据类Foo创建对象obj

obj = Foo() obj.Bar() #执行Bar方法 obj.Hello('wupeiqi') #执行Hello方法 

  面向对象:【创建对象】【通过对象执行方法】

  函数编程:【执行函数】

应用的场景不同造成的编程方式也不同,总结:函数式的应用场景 --> 各个函数之间是独立且无共用的数据

这里再对面向对象再进行一下细分:

  1、面向对象不是所有情况都适用

  2、面向对象编程

    a 定义类

      class Foo:

        def 方法1(self,bb):

          pass

      obj = Foo(bb)

    b 根据类创建对象(创建一个Foo类的实例)

     可以使用对象去执行类中的方法

  3、self,形式参数,代指执行方法的对象。python内部自动传递

  4、类+括号 => 自动执行类中的 init方法: 创建了一个对象

    在init 有一个特殊名字:构造方法

    ==》 初始化

    del 解释器销毁对象时候自动调用,特殊的名: 析构方法 静态属性,静态方法,类方法,组合

  静态属性的作用 将函数属性伪装成数据属性(封装逻辑)

  用法 在方法(函数属性)上面加 @property 静态属性

  静态方法 跟类和实例无关系,名义上归属类管理,但不能使用类变量和实例变量

  用法 在方法(函数属性)上面加 @staticmethod

  特点: 只能使用静态变量, 所以始终占用同一个内存, 执行效率更高, 但不会被自动回收.

class Desk:
     def __init__(self,name,width,length,heigh):
         self.name = name
         self.width = width
         self.length = length
         self.heigh = heigh
     @staticmethod # 用函数修饰符来声明静态方法
     def cal_area():
         print("我跟类和实例没有任何关系哦!")

13 # 静态方法不能调用类和实例的属性

类方法 不需要self参数,自动加cls参数,python底层自动传入类对象。

  跟实例没有关系,类自己调用;只能访问类的属性,不能访问实例属性

  用法 在方法(函数属性)上面加 @classmethod 

#@classmethod 类方法
class Desk:
     same = "study"
     def __init__(self,name,width,length,heigh):
         self.name = name
         self.width = width
         self.length = length
         self.heigh = heigh
     @classmethod
     def cal_area(cls):
         print(cls)  # 接收一个类名,就是类本身,可以访问类的属性,不能访问实例的属性
         print(cls.same)

    Desk.cal_area() # 类调用方法  此刻不需要传参数,自动传了参数进去

 组合 大类包含小类,可以作关联

  就是将不同的类混合并加入到其他类中,来 增加类的功能 / 提高代码的重用性 / 易于维护(对类的修改会直接反应到整个应用中) 。我们可以实例化一个更大的对象,同时还可以添加一些实例属性和实例方法的实现来丰富实例对象的功能。

#!/usr/bin/env python

@--@ coding:utf-8 @--@
Author:nuanyang

class Teacher: def init(self,name,age,sex,salary,level): self.name = name self.age = age self.sex =sex self.salary =salary self.level = level

def walk(self):
    print('%s is walking'%self.name)
def teach(self):
    print('%s is teaching' % self.name)
def tell_info(self):
    print('''
    ------%s info --------
    NAME:%s
    AGE:%s
    SEX:%s
    SAL:%s
    LEVEL:%s
    '''%(self.name,self.name,self.age,self.sex,self.salary,self.level))
def tell_course(self):
    if 'counrses' in self.__dict__:
        for obj in self.courses:
            obj.tell_course()
    else:
        pass

class Date: def init(self,year,mon,day): self.year = year self.mon = mon self.day = day def tell_birth(self): print('%s-%s-%s'%(self.year,self.mon,self.day))

class Student: def init(self,name,age,sex,group): self.name = name self.age = age self.sex = sex self.group = group

def walk(self):
    print('%s is walk
原文地址:https://www.cnblogs.com/songcheng/p/7119292.html