什么是面向对象编程

  • 类 + 对象

    • class 类:

      • def 函数1():

        • pass
      • def 函数2():
        • pass
    • obj是对象, 实例化的过程
      • obj = 类()
      • obj.函数1()

例1 , 某些方法被反复调用. 如: 登录服务器并上传文件.

函数式编程:

def upload():
# 连接服务器
# 上传文件
# 关闭 def cmd():
# 连接服务器
# 执行命令
# 关闭 def upload_cmd():
# 连接服务器
# 上传文件
# 执行命令
# 关闭

面向对象编程:

class SSH:
def __init__(self, host, port, pwd, username):
self.host=
... def connection(self):
# 去创建连接
self.conn = 和服务器创建的连接对象() def close(self):
# 关闭
self.conn.关闭 def upload(self):
self.conn 使用连接上传文件 def cmd(self):
self.conn 使用连接执行命令 obj = SSH(.......)
obj.connection()
obj.upload()
obj.close() obj = SSH(.......)
obj.connection()
obj.cmd()
obj.cmd()
obj.upload()
obj.cmd()
obj.close()

注:  若需要改变服务器连接, 函数式编程所有函数都需要修改;  而面向对象编程只需要更改connection()方法即可.

例2: 多个函数需要传入多个共同的参数. 如:多个函数需要的参数有相同部分也有不同部分(类似java中方法重载)

函数式编程:

def f1(host, port, pwd, arg)
pass def f2(host, port, pwd, arg, arg2)
pass def f3(host, port, pwd, arg, arg2, arg3)
pass f1(1,1,1,2)
f2(1,1,1,2,2)
f3(1,1,1,2,2,3)

面向对象编程:

class Foo:
def __init__(self, host, port, pwd):
self.host = host
self.port = port
self.pwd = pwd def f1(arg):
pass def f2(arg,arg2):
pass def f3(arg, arg2, arg3):
pass obj = Foo(1,1,1)
obj.f1(1)
obj.f2(2,2)
obj.f3(3,3,3)

什么时候适用面向对象

  • 多个步骤在不同函数中反复调用.可以将各个步骤抽取出来写在一个类中,每个步骤写一个方法,这样调用时就可以任意组合.
  • 根据一个模版创建某些东西(也是加以某些限制)
  • 多个函数传入多个共同的参数时,可以写在一个类中,共同的参数抽取出来写在构造函数中.
class Foo:
# 静态字段 (公有属性), 适合每一个对象都有的共同的值时, 把这个值抽取出来作为静态字段.
country = "中国" def __init__(self, name, count):
# 普通字段(普通属性)
self.name = name
self.count = count def bar(self):
pass obj1 = Foo('河南', 100000)
obj1.bar()

封装:

  • 类中封装: 字段, 方法
  • 对象中封装: 普通字段的值
  • class F1:
    def __init__(self, n):
    self.n = n
    print('F1') class F2:
    def __init__(self, arg1):
    self.a = arg1
    print('F2') class F3:
    def __init__(self, arg2):
    self.b = arg2
    print('F3') o1 = F1('alex')
    o2 = F2(o1)
    o3 = F3(o2) print(o3.b.a.n) # 输出alex

    封装

继承:

  • self代指当前对象
  • class F1:
    def __init__(self):
    print('F1') def a1(self):
    print('F1a1') def a2(self):
    print('F1a2') class F2(F1):
    def __init__(self):
    print('F2') def a1(self):
    self.a2()
    print('F2a1') def a2(self):
    print('F2a2') class F3(F2):
    def __init__(self):
    print('F3') # def a1(self):
    # print('F3a1') def a2(self):
    print('F3a2') obj = F3()
    obj.a1() # 先返回F3a2然后返回F2a1

    继承

字段

  • 普通字段(保存在对象中)
  • 静态字段(保存在类中)

方法

  • 普通方法(保存在类中, 调用者对象)
  • 静态方法(可以有任意个参数)
    • 在方法上添加注释 @staticmethod
    • 不需要创建对象,可以直接类名.方法()调用
    • class F1:
      @staticmethod # 标识某方法为静态方法
      def a1():
      print('alex') F1.a1() # 调用方法

组合

  • 把一个类实例化, 实例化对象作为参数传入另一个类.
  • #!/usr/bin/python
    # -*- coding: utf-8 -*- """
    命名规范:
    1. 类名每个单词都要首字母大写
    2. 类名下面要写注释
    """ class SchoolMember(object):
    """
    学校成员基类
    """
    member = 0 def __init__(self, name, age, sex):
    self.name = name
    self.age = age
    self.sex = sex
    self.enroll() def enroll(self):
    """
    注册
    :return:
    """
    print("just enrolled a new school memeber [%s]" % self.name)
    # self.member += 1 # 每新注册一个, 成员数加1. 这样写只是当前子类成员数加1;要想父类SchoolMember总成员数加1, 需得加到全局变量里.
    SchoolMember.member += 1 def tell(self):
    print('------------%s info ----------' % self.name)
    for k, v in self.__dict__.items(): # __dict__方法可以打印出类的所有变量
    print("\t", k, v)
    print("end".center(33, "-")) def __del__(self):
    print("开除了[%s]" % self.name)
    SchoolMember.member -= 1 class School(object):
    """
    假装是另一个社团团员类(以便Teacher和Student能继承;否则School是个组织, Teacher/Student是不能继承的)
    """
    def open_branch(self, addr):
    print("opening new branch in ", addr) class Student(SchoolMember):
    def __init__(self,name, age, sex, course, tuition, school_obj):
    SchoolMember.__init__(self, name, age, sex)
    self.school = school_obj # 组合. 相当于把School实例化, 再把实例化对象传入Student作为一个参数,这样就可以调用School的变量和方法
    self.course = course
    self.tuition = tuition # fee
    # self.enroll() # enroll()方法在每个子类里都需要, 可以直接写在父类里
    self.amount = 0 def pay_tuition(self, amount):
    print("student [%s] has just paid [%s]" %(self.name, amount))
    self.amount += amount

    组合

Python 面向对象补充的更多相关文章

  1. Python 面向对象-------补充

    Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触过 ...

  2. Python面向对象补充以及异常处理

    面向对象相关内容 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() isinstance(o ...

  3. Python 面向对象 (补充) , 反射 , 内置函数

    面向对象中内置函数 issubclass方法: 检查第一个参数是否是第二个参数的子子孙孙类     返回  :   是一个布尔值 class Base(object): pass class Foo( ...

  4. Python 面向对象的补充

    isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(object) ...

  5. python(26)- 面向对象补充Ⅱ

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)判断obj是否是类 cls 的对象 class Foo(object): ...

  6. Python 面向对象 基础

    编程范式概述:面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现 ...

  7. [Python学习笔记][第六章Python面向对象程序设计]

    1月29日学习内容 Python面向对象程序设计 类的定义与使用 类定义语法 使用class关键词 class Car: def infor(self): print("This is ca ...

  8. python 面向对象进阶之内置方法

    一 isinstance(obj,cls)和issubclass(sub,super) 1.1,isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(obj ...

  9. python面向对象编程进阶

    python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...

随机推荐

  1. 打印页面时a标签不显示URL的方法

    以前写博客啊,总想写一篇大作,然后希望能挂到博客园首页,隔一会儿看看阅读量有多少.其实哪有那么多大作,大部分时间都是解决了一个小问题,然后需要记录一下.比如下面这篇. 今天遇到一个需求是,打印网页时, ...

  2. 【工具向01】——markdown 文本编辑语言相关

    markdown简介 Markdown是一种轻量级标记语言创始人为约翰·格鲁伯.它允许人们"使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML或HTML文档".这种语言吸 ...

  3. 详解C#特性和反射(二)

    使用反射(Reflection)使得程序在运行过程中可以动态的获取对象或类型的类型信息,然后调用该类型的方法和构造函数,或访问和修改该类型的字段和属性:可以通过晚期绑定技术动态的创建类型的实例:可以获 ...

  4. Java NIO 基础知识

    前言 前言部分是科普,读者可自行选择是否阅读这部分内容. 为什么我们需要关心 NIO?我想很多业务猿都会有这个疑问. 我在工作的前两年对这个问题也很不解,因为那个时候我认为自己已经非常熟悉 IO 操作 ...

  5. 玩转mongodb(八):分布式计算--MapReduce

    MongoDB提供了MapReduce的聚合工具来实现任意复杂的逻辑,它非常强大,非常灵活.MapReduce使用JavaScript作为“查询语言”,能够在多台服务器之间并行执行.它会将一个大问题拆 ...

  6. 自我总结(四) ---java web项目完结,j2ee的开始

    自我完善的过程就是在不断的自我总结不断的改进. 前半个月刚好把项目做完了,项目也答辩了.总的来说吧,我觉得自己在java web这块知识上不算是彻彻底底把他弄懂了,就是说到的知识点都能够回答的上来一些 ...

  7. elasticSearch6源码分析(6)http和transport模块

    1.http模块概述 The http module allows to expose Elasticsearch APIs over HTTP. The http mechanism is comp ...

  8. Error: [$injector:unpr] Unknown provider: $scopeProvider <- $scope <-错误解决方案

    做项目的时候因为懒,在写service时直接复制了控制器的依赖注入,之后就出现了这个错误,查了半天. 解决其实很简单,删除掉service中注入的$scope即可.

  9. Spring事务内方法调用自身事务 增强的三种方式

    ServiceA.java文件: 查看Spring Tx的相关日志:  可以看到只创建了一个事物ServiceA.service方法的事务,但是callSelf方法却没有被事务增强; 分析原因:Spr ...

  10. vs code 插件收集

    名称 简述 Auto Close Tag 自动闭合HTML标签 Auto Import Typescript自动import提示 Auto Rename Tag 修改HTML标签时,自动修改匹配的标签 ...