Python(面向对象Ⅰ)

一、面向对象初识

  1. 回顾面向过程编程与函数式编程

    # 面向过程编程 测量对象的元素个个数。
    s1 = 'fjdsklafsjda'
    count = 0
    for i in s1:
    count += 1 l1 = [1,2,3,4]
    count = 0
    for i in l1:
    count += 1
    # 函数式编程
    def func(s):
    count = 0
    for i in s:
    count += 1
    return count
    func('fdsafdsa')
    func([1,2,3,4])

    通过对比可知:函数编程较之面向过程编程最明显的两个特点:

    • 减少代码的重用性
    • 增强代码的可读性
  2. 函数式编程与面向对象编程

    # 函数式编程
    # auth 认证相关
    def login():
    pass
    def regisgter():
    pass
    # account 账户相关
    def func1():
    pass
    def func2():
    pass
    # 购物车相关
    def shopping(username,money):
    pass
    def check_paidgoods(username,money):
    pass
    def check_unpaidgoods(username,money):
    pass
    def save(username,money):
    pass
    # 面向对象式编程
    class LoginHandler:
    def login(self):
    pass
    def regisgter(self):
    pass class Account:
    def func1(self):
    pass
    def func2(self):
    pass class ShoppingCar:
    def shopping(username,money):
    pass
    def check_paidgoods(username,money):
    pass
    def check_unpaidgoods(username,money):
    pass
    def save(username,money):
    pass

    通过对比可以看出面向对象第一个优点:

    面向对象编程:是一类相似功能函数的集合,使你的代码更清晰化,更合理化。

    说第二个优点之前,先看看什么是面向对象。

    面向对象的程序设计的核心是对象(上帝式思维),要理解对象为何物,必须把自己当成上帝,上帝眼里世间存在的万物皆为对象,不存在的也可以创造出来。

    那什么是类?什么是对象?

    类:就是具有相同属性和功能的一类事物。

    对象:就是类的具体表现。

    再说第二个优点:面向对象,要拥有上帝的视角看问题,类其实就是一个公共模板(厂房),对象就从具体的模板实例化出来(慢慢体会)。

  3. 类的结构

    class Human:
    """
    此类主要是构建人类
    """
    mind = '有思想' # 第一部分:静态属性 属性 静态变量 静态字段
    dic = {}
    l1 = []
    def work(self): # 第二部分:方法 函数 动态属性
    print('人类会工作')
    class 是关键字与def用法相同,定义一个类。
    Human是此类的类名,类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头。
    类的结构从大方向来说就分为两部分:
    静态变量。
    动态方法。

二、从类名的角度研究类

  1. 第一种,查看类中的所有内容:类名.__ dict __方式

    class Human:
    """
    此类主要是构建人类
    """
    mind = '有思想' # 第一部分:静态属性 属性 静态变量 静态字段
    dic = {}
    l1 = []
    def work(self): # 第二部分:方法 函数 动态属性
    # print(self)
    print('人类会工作') print(Human.__dict__)
    print(Human.__dict__['mind'])
    Human.__dict__['mind'] = '无脑'
    print(Human.__dict__) # 错误
    #通过这种方式只能查询,不能增删改.
    # 第一种方式只用户查询全部内容(一般不用单独属性查询).
  2. 第二种:万能的点

    class Human:
    """
    此类主要是构建人类
    """
    mind = '有思想' # 第一部分:静态属性 属性 静态变量 静态字段
    dic = {}
    l1 = []
    def work(self): # 第二部分:方法 函数 动态属性
    # print(self)
    print('人类会工作')
    print(Human.mind) # 查
    Human.mind = '无脑' # 改
    print(Human.mind)
    del Human.mind # 删
    Human.walk = '直立行走'
    print(Human.walk)
    # 通过万能的点 可以增删改查类中的单个属性

    对以上两种做一个总结:如果想查询类中的所有内容,通过 第一种__ dict __方法,如果只是操作单个属性则用万能的点的方式。

  3. 类名操作动态方法

    前提:除了两个特殊方法:静态方法,类方法之外,一般不会通过类名操作一个类中的方法

    class Human:
    """
    此类主要是构建人类
    """
    mind = '有思想' # 第一部分:静态属性 属性 静态变量 静态字段
    dic = {}
    l1 = []
    def work(self): # 第二部分:方法 函数 动态属性
    # print(self)
    print('人类会工作')
    def tools(self):
    print('人类会使用工具') Human.work(111)
    Human.tools(111)
    下面可以做,但不用。
    Human.__dict__['work'](111)

三、从对象的角度研究类

  1. 什么是对象

    对象是从类中出来的,只要是类名加上(),这就是一个实例化过程,这个就会实例化一个对象。

    执行下列代码会发生什么事情?

    class Human:
    mind = '有思想'
    def __init__(self):
    print(666)
    print(self) # <__main__.Human object at 0x00000191508AA828> def work(self):
    print('人类会工作') def tools(self):
    print('人类会使用工具')
    obj = Human() # 只要实例化对象,它会自动执行__init__方法
    print(obj) # <__main__.Human object at 0x00000191508AA828>
    # 并且obj的地址与self的地址相同

    其实实例化一个对象总共发生了三件事:

    1. 在内存中开辟了一个对象空间。
    2. 自动执行类中的__ init __ 方法,并将这个对象空间(内存地址)传给了__ init __方法的第一个位置参数self。
    3. 在__ init __ 方法中通过self给对象空间添加属性。
    class Human:
    mind = '有思想'
    language = '使用语言'
    def __init__(self,name,sex,age,hobby):
    # self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。
    self.n = name
    self.s = sex
    self.a = age
    self.h = hobby obj = Human('barry','男',18,'运动')
  2. 对象操作对象空间属性

    对象查询对象中所有属性。 对象.__ dict __

    class Human:
    
        mind = '有思想'
    language = '实用语言'
    def __init__(self,name,sex,age,hobby):
    # self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。
    self.n = name
    self.s = sex
    self.a = age
    self.h = hobby obj = Human('barry','男',18,'运动')
    print(obj.__dict__) # {'n': 'barry', 'h': '运动', 's': '男', 'a': 18}

    对象操作对象中的单个属性。 万能的点 .

    class Human:
    
        mind = '有思想'
    language = '实用语言'
    def __init__(self,name,sex,age,hobby):
    # self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。
    self.n = name
    self.s = sex
    self.a = age
    self.h = hobby obj = Human('barry','男',18,'运动')
    obj.job = 'IT' # 增
    del obj.n # 删
    obj.s = '女' # 改
    print(obj.s) # 查
    print(obj.__dict__)

    对象查看类中的属性

    class Human:
    
        mind = '有思想'
    language = '实用语言'
    def __init__(self,name,sex,age,hobby):
    self.n = name
    self.s = sex
    self.a = age
    self.h = hobby obj = Human('barry','男',18,'运动')
    print(obj.mind)
    print(obj.language)
    obj.a = 666
    print(obj.a)

    对象操作类中的方法

    class Human:
    
        mind = '有思想'
    language = '实用语言'
    def __init__(self,name,sex,age,hobby):
    self.n = name
    self.s = sex
    self.a = age
    self.h = hobby def work(self):
    print(self)
    print('人类会工作') def tools(self):
    print('人类会使用工具') obj = Human('barry','男',18,'运动')
    obj.work()
    obj.tools()

    类中的方法一般都是通过对象执行的(出去类方法,静态方法外),并且对象执行这些方法都会自动将对象空间传给方法中的第一个参数self.

四、self 是什么?

self其实就是类中方法(函数)的第一个位置参数,只不过解释器会自动将调用这个函数的对象传给self。所以咱们把类中的方法的第一个参数约定俗成设置成self, 代表这个就是对象。

一个类可以实例化多个对象

obj1= Human('小胖','男',20,'美女')
obj2= Human('相爷','男',18,'肥女')
print(obj1,obj2)
print(obj1.__dict__)
print(obj2.__dict__)

19.Python略有小成(面向对象Ⅰ)的更多相关文章

  1. 20.Python略有小成(面向对象Ⅱ)

    Python(面向对象Ⅱ) 一.类的空间问题 何处可以添加对象属性 class A: def __init__(self,name): self.name = name def func(self,s ...

  2. 19 Python之面向对象(成员)

    1. 成员 在类中你能写的所有内容都是类的成员 2. 变量 1. 实例变量: 由对象去访问的变量. class Person: def __init__(self, name, id, gender, ...

  3. python学习------面向对象的程序设计

    一 面向对象的程序设计的由来 1940年以前:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数 据.简单来说,就是直接编写 和 的序列来代表程序语言 ...

  4. Python OOP面向对象

    一.什么是面向对象的程序设计 1.面向过程 程序设计:核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么......面向过程的设计就好比精心设计好一条流水线,是一种机械式的思维方式. 优点是 ...

  5. Python之面向对象封装

    Python之面向对象封装 封装不是单纯意义的隐藏 什么是封装: 将数据放在一个设定好的盒子里,并标出数据可以实现的功能,将功能按钮外露,而隐藏其功能的工作原理,就是封装. 要怎么封装: 你余额宝有多 ...

  6. 10 . Python之面向对象

    面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向对象初识别 面向过程v ...

  7. python基础——面向对象编程

    python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...

  8. Python的面向对象3

    接下来,我们接着讲Python的面向对象,在上一次的博客中,我们详细介绍了类与对象的属性,今天,我们来详细介绍一下面向对象中的方法! 1.定义实例方法 一个实例的私有属性就是以__开头的属性,无法被外 ...

  9. Python的面向对象2

    我们接着讲解Python的面向对象 1.初始化实例属性 在现实生活中,一种类型的实例会具有相同的某些属性,把这些实例划分为一个类型,则这些实例必然有相似的部分.但是,在创建实例之后,我们一个一个的为实 ...

随机推荐

  1. Lightning Web Components 安装试用(一)

    Lightning Web Components 简称(lwc) 是一个快速企业级的web 组件化解决方案,同时官方文档很全,我们可以完整的 学习lwc 项目结构 使用npx 官方提供了一个creat ...

  2. 机器学习---逻辑回归(一)(Machine Learning Logistic Regression I)

    逻辑回归(Logistic Regression)是一种经典的线性分类算法.逻辑回归虽然叫回归,但是其模型是用来分类的. 让我们先从最简单的二分类问题开始.给定特征向量x=([x1,x2,...,xn ...

  3. CSS Variables:css自定义属性的使用

    CSS Variables,一个并不是那么新的东西,但对css来说绝对是一场革命.之前使用变量的时候,需要借助sass.less等预处理工具来实现,现在我们可以直接使用css来声明变量. 一.兼容性 ...

  4. CodeChef November Challenge 2019 Division 1题解

    传送门 AFO前的最后一场CC了--好好打吧-- \(SIMGAM\) 偶数行的必定两人平分,所以只要抢奇数行中间那个就行了 这题怎么被爆破了 //quming #include<bits/st ...

  5. c博客作业—分支,结构顺序

    1展现PTA总分 1 2 2本章学习类容总结 1常量和变量 常量:在运行中其值不变的量被称为常量,常量的类型通常是由书写格式决定,包括整型常量,实数型变量等等. 变量: 在运行中其值可变的量被称为变量 ...

  6. Python各种扩展名(py, pyc, pyw, pyo, pyd)区别

    扩展名 在写Python程序时我们常见的扩展名是py, pyc,其实还有其他几种扩展名.下面是几种扩展名的用法. py py就是最基本的源码扩展名 pyw pyw是另一种源码扩展名,跟py唯一的区别是 ...

  7. 2015-2016-2《Java程序设计》团队博客3

    项目进展 这周就是对上周所列出的类进行具体实现.但是到目前为止还没有遇到一些实质性的问题.虽然感觉没有问题就是最大的问题,但是还是希望能够尽早发现bug并及时改掉. 目前已经完成前几个文件之间的架构, ...

  8. Mac php 装imagick扩展 菜鸟教程

    1.2.直接brew install imagemagick@6完成安装 2.去http://pecl.php.net/package/imagick下载安装包 2.1.下载完后解压tar -xzvf ...

  9. Service Function Chaining Resource Allocation: A Survey

    摘要: 服务功能链(SFC)是未来Internet的一项关键技术. 它旨在克服当前部署模型的僵化和静态限制. 该技术的应用依赖于可以将SFC最佳映射到衬底网络的算法. 这类算法称为"服务功能 ...

  10. ajax请求传base64太大,springboot后台无法接收

    ajax请求传base64太大,springboot后台无法接收 .具体体现形式:对应属性值为null 在 application.yml中添加: server: tomcat: max-http-p ...