zoukankan      html  css  js  c++  java
  • python之面向对象

    python编程分为三个阶段:

    1. 面向过程编程:根据业务逻辑从上到下垒
    2. 函数式编程:将某功能进行函数封装,使用时调用函数即可,减少代码重复量
    3. 面向对象编程:对函数进行分类和封装

    理论上我们是比较鄙视面向过程编程的,那么问题来了,那函数式编程和面向对象编程我们该用哪个呢?

    先来看两个的特点吧:

    • 函数编程,逻辑清晰,简单,为项目而生,维护困难,函数式编程提倡的解决方案是数据是不可变的, 就没有了一直在改变的状态, 从而降低了复杂度.
    • 面向对象,大而全,复杂,为大项目而生,开发周期长,理论上长久维护简单,实际上一塌糊涂...面向对象一个最大的特点是抽象, 所以面向对象式编程特别适合处理业务逻辑,因此被广泛应用于目前的软件开发当中.

    总结

    • 那么什么情况下用面向对象呢?当某一些函数具有相同参数时,可以使用面向对象的方式,将参数值一次性的封装到对象,以后去对象中取值即可,我觉得这个是对于我这种初学者的最简答案了吧...

    • 什么时候使用函数式编程呢?各个函数之间是独立且无共用的数据

    类和对象的创建

    面向对象编程方式的落地,需要使用类和对象来实现:

    • 类可以看为一个模板,模板了包含了多个函数,函数实现某些功能
    • 对象是根据模板创建的实例,通过实例对象可以调用类中的功能函数

    • class是关键词,声明创建一个类
    • 类后面加(),表示创建对象
    • 类中定义函数时,第一个参数必须为self,而类中的函数称为方法

    面向对象的三大特性

    1. 封装
    2. 继承
    3. 多态

    面向对象之封装

    封装就是将内容封装到某个地方,以后再去调用被封装在某处的内容,在使用面向对象的封装特性时,需要:

    1. 将内容封装到某处
    2. 从某处调用被封装的内容
    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    class Port:
        def __init__(self,total):
            """
            __init__称之为构造方法
            :param total: Port类传递的参数
            """
            self.total = total
    
        def num(self):
            print(self.total)
    
    
    
    obj = Port('123')
    obj.num()

    面向对象之继承基础

    继承,面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容。

    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_
    
    class People:
        def __init__(self):
            print("""
            你的通用特征有:四肢、头发、眼、耳朵
            """)
    
    class China(People):
        def info(self):
            print("""
            你是中国人,你的语言是中文,皮肤是黄色
            """)
    
    class Us(People):
        def info(self):
            print("""
            你是美国人,你的语言是英文,皮肤是黑色
            """)
    
    c = China()
    c.info()
    
    m = Us()
    m.info()

    多继承

    python中的继承可以多继承,意思就是一个子类可以有多个父类,比如:

    class a(b,c,d,e):   #b,c,d,e为类
        def xxx(self):
        pass

    多继承中需要注意的是:

    • 多继承时,按照继承的顺序排优先级c3(c2,c1)

      深度优先,无共同父类,多继承方式

      图待定……

    面向对象中的类成员

    1. 字段
    2. 方法
    3. 属性

    字段

    字段分为两种:

    • 普通字段
    • 静态字段

    普通字段我们使用的较多,一般是在构造方法时使用.

    静态字段在代码加载时已经创建

    字段保存位置规则
    普通字段 保存在对象中 只能用对象去访问
    静态字段 保存在类中(节约内存空间) 对象/类均可访问,但一般使用类访问,万不得已才使用对象访问)

    方法

    所有方法都属于类,类基本可以分为三中类型:

    • 普通方法
    • 静态方法
    • 类方法
    方法调用方式特征
    普通方法 由对象去调用执行,属于类 至少一个self,对象调用
    静态方法 属于类,但通过类来调用,不依赖于任何对象,方法内部不需要对象封装的值时,可使用静态方法 任意参数,没有self,上面添加@staticmethod,类似装饰器的东东
    类方法 静态方法的一种特殊形式,由类调用 至少一个cls参数,上面添加classmethod

    静态方法:

    class Province:
        country='中国' #静态字段
    
        def __init__(self,name):
            self.name=name #普通字段
    
        @staticmethod   #静态方法
        def show(arg1,arg2):
            print(arg1,arg2)
    
    print(Province.country)
    hn=Province('HN')
    print(hn.country)
    Province.show(123,456)   #静态方法调用

    属性

    属性的特征:具有方法的写作形式,具有字段的访问形式.可取值,可设置,可删除.

    先来看看属性是个什么东西吧:

    class Pager:
        def __init__(self,all_count):
            self.all_count=all_count
    
        @property       #定义属性
        def all_pager(self):
            a1,a2=divmod(self.all_count,10)
            if a2==0:
                return a1
            else:
                return a1+1
    
        @all_pager.setter       #赋值属性,将value赋值给方法的参数
        def all_pager(self,value):
            print(value)
    
        @all_pager.deleter      #删除属性
        def all_pager(self):
            print('del all_pager')
    
    obj=Pager(101)
    ret=obj.all_pager #不需要加括号
    print(ret)
    
    obj.all_pager=102
    
    del obj.all_pager

    属性的基本使用

    属性的定义和调用需要注意以下几点:

    属性存在的意义:访问属性时,可以制造出和访问字段完全相同的假象,由于属性是由方法变种而来,如果python中没有属性,完全可以由方法来替代.

    属性的两种定义方式

    python3中全都是新式类,有三种@property装饰方式:

    • @property
    • 方法名.setter
    • 方法名.deleter

    其实就像上面的例子.

    还有一种方式是静态字段方式.创建值为property的对象的静态字段.
    来看个例子:

    class Pager:
        def __init__(self,name):
            self.name=name
    
        def f1(self):
            return 123
    
        def f2(self,value):
            print(value)
    
        def f3(self):
            print('del....')
    
        foo=property(fget=f1,fset=f2,fdel=f3)
    
    obj=Pager(110)
    ret=obj.foo #调用fget
    print(ret)
    
    obj.foo=778 #调用fset
    
    del obj.foo #调用fdel

    类方法

    类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量

    class StudentManagement(object):
        @classmethod
        def register(cls, school, course):
            student = Student(school=school, course=course)
            return student
    
        @classmethod
        def pay(cls, student, money):
            money = student.payment(paymoney=money)
            return {
                'student': student,
                'paymoney': money
            }
    
        @classmethod
        def select_class(cls, student, class_):
            student.select_class_(class_=class_)
            return {
                'course': class_.course.name,
                'teacher': class_.teacher.name,
            }
  • 相关阅读:
    PHP 5.5.0 Alpha5 发布
    Ubuntu Touch 只是另一个 Android 皮肤?
    MariaDB 10 已经为动态列提供文档说明
    Percona Toolkit 2.1.9 发布,MySQL 管理工具
    Oracle Linux 6.4 发布
    Ruby 2.0.0 首个稳定版本(p0)发布
    Apache Pig 0.11.0 发布,大规模数据分析
    Node.js 0.8.21 稳定版发布
    红薯 MySQL 5.5 和 5.6 默认参数值的差异
    Django 1.5 正式版发布,支持 Python 3
  • 原文地址:https://www.cnblogs.com/patrick0715/p/5832586.html
Copyright © 2011-2022 走看看