面向对象

面向对象

  • 与面向过程对比:

    • 面向过程:数学逻辑的映射,学会做个好员工
    • 面向对象:生活逻辑的映射,学会做个好领导
  • 生活实例:
    • 类: 人 手机 电脑

      • 对象: 我的手机、女朋友的手机 你的那部T400、老板桌上的电脑
  • 官方定义:
    • 类:具有相同特征(属性和行为)的事物的抽象
    • 对象:某个类的具象
  • 编程语言:
    • 类:是一种自定义的数据类型
    • 对象:某个类类型的变量

面向对象语法

  • 类的定义:

    class 类名:
    内容
  • 语法说明:

    • 定义类需要使用关键字class
    • 类名:原则上只要符合标识符命名规范即可,但是通过我们都使用大驼峰(每个单词首字母大写)风格命名
      • 如:UserName
    • 类名后面的':'不要忘记
    • 类的内容要进行整体缩进
    • 行为:通过方法体现,在类中定义相关的函数即可(第一个参数通常是self)
    • 属性:通过变量体现,在需要时动态添加,很多时候定义类时没有体现
    • 成员访问:
      • 属性:对象.属性名
      • 方法:对象.方法名()
  • 示例:

    # 定义类
    class Person:
    # 行为通过方法体现 # 吃饭
    def eat(self):
    print('红烧排骨我喜欢吃') # 睡觉
    def sleep(self):
    print('睡觉也是一种生活态度') # 定义对象
    liang = Person()
    # 调用方法
    liang.eat()
    liang.sleep()
    # 属性时动态添加的
    liang.name = '上官'
    # 获取属性
    print(liang.name)
  • self使用

    class Person:
    def run(self):
    # self表示当前对象:谁调用该方法就表示谁
    print('{}每天以2m/s的速度慢跑5km'.format(self.name)) def introduce(self):
    # 不但可以访问成员属性
    print('我叫{}'.format(self.name))
    # 还可以调用成员方法
    self.run() fei = Person()
    fei.name = '欧阳'
    fei.run()
    fei.introduce() long = Person()
    long.name = '诸葛'
    long.introduce()
    • 说明:
    1.类中的每个成员方法都有一个self参数,调用的时候不需要传递该参数
    2.该参数的名字可以不是self,只不过通常我们都使用这个
    3.self表示当前对象,对调用该方法self就代表谁,哪个对象调用就表示哪个对象
    4.通过self可以访问成员属性,也可以调用成员方法
  • __str__方法

    class Person:
    # 使用print方法打印对象,默认打印 类名 + 地址
    # 若想打印特定内容,重写该方法即可,要求返回一个字符串
    def __str__(self):
    return '我叫{},今年{}'.format(self.name, self.age) james = Person()
    james.name = '勒布朗.詹姆斯'
    james.age = 33
    print(james)
  • 练习:

    • 自定义一个狗类,添加如下属性和方法:

      • 属性:名字、年龄、颜色
      • 方法:跑、吃、游泳、吠、描述
  • 构造方法:创建对象后,初始化属性时,系统会自动调用该方法

    class Cat:
    def __str__(self):
    return 'name:{},age:{},color:{}'.format(self.name, self.age, self.color) # 构造方法:创建对象后,初始化系统就会自动调用该方法
    def __init__(self, name, age, color):
    print('__init__')
    self.name = name
    self.age = age
    self.color = color # 这种形式比较繁琐
    # tom = Cat()
    # tom.name = 'Tom'
    # tom.age = 3
    # tom.color = '蓝色' # 这种比较简洁
    tom = Cat('Tom', 3, '蓝色')
    print(tom)
  • 析构方法:当对象释放时系统会自动调用,通常用于释放资源

    class Pig:
    # 析构方法:当对象释放时,系统会自动调用
    # 若手动使用del删除,则会立即调用该方法
    # 该方法一般做资源释放处理:数据库连接断开,文件关闭
    def __del__(self):
    print('大师兄,我不行了') bajie = Pig()
    del bajie
    print('八戒,一路走好!')
  • 经典示例:小明手里有两张牌,左手♥K,右手♠A,小明交换两手的牌后,手里分别是什么?

    • 思路:

      • 先找到对象:左手、右手、♥K、♠A、小明
      • 根据对象抽象出对应的类:人、手、牌
      • 根据需要写出相应的逻辑,很可能反过来完善类的设计
      • 按照题目要求创建相关对象,调用相关方法,实现相关功能
    • 代码:
    # 对象:小明、左手、右手、♥K、♠A
    # 类:人、手、牌
    # 设计相应的类 # 扑克牌
    class Poker:
    def __init__(self, color, number):
    self.color = color
    self.number = number def __str__(self):
    return '{}{}'.format(self.color, self.number) # 创建两张牌
    p1 = Poker('♥', 'K')
    p2 = Poker('♠', 'A') # 手的类
    class Hand:
    def __init__(self, poker):
    self.poker = poker def hold_poker(self, poker):
    self.poker = poker # 创建左右两只手
    left_hand = Hand(p1)
    right_hand = Hand(p2) # 人的类
    class Person:
    def __init__(self, name, left_hand, right_hand):
    self.name = name
    self.left_hand = left_hand
    self.right_hand = right_hand # 展示手里的牌
    def show(self):
    print('{}张开手'.format(self.name), end=' ')
    print('左手:{}'.format(self.left_hand.poker), end=',')
    print('右手:{}'.format(self.right_hand.poker)) # 交换两手的牌
    def swap(self):
    self.left_hand.poker, self.right_hand.poker = self.right_hand.poker, self.left_hand.poker
    print('{}交换两手的牌'.format(self.name)) # 创建小明对象
    xiaoming = Person('小明', left_hand, right_hand) # 展示手里的牌
    xiaoming.show() # 交换两手的牌
    xiaoming.swap() #再次展示
    xiaoming.show()
  • 练习:设计一个数学类,有两个成员属性,成员方法有加、减、乘、除,展示成员。

常用内置函数

  • 内置函数:在类的内部,特定时机自动触发的函数。

  • 示例:setattr、getattr、delattr

    class Person:
    def __init__(self, name):
    self.name = name def __str__(self):
    return '姓名:{}'.format(self.name) def __del__(self):
    print('对象即将销毁') # 当获取不存在的属性时,会自动触发该方法
    def __getattr__(self, item):
    if item == 'age':
    return 18
    else:
    return '你猜' # 当设置不存在的属性时,会自动触发该方法
    def __setattr__(self, key, value):
    print(key, value)
    self.__dict__[key] = value # 销毁对象成员属性时,会自动触发该方法
    def __delattr__(self, item):
    print(item, '即将销毁') xiaoming = Person('小明')
    xiaoming.age = 20
    print(xiaoming.age)
    # 存放对象的所有属性
    # print(xiaoming.__dict__)
    # print(xiaoming)
    del xiaoming.age
  • 将对象当做字典操作,特定时机会自动触发的方法

    class Person:
    # 将对象当做字典操作,设置键值对时会触发该方法
    def __setitem__(self, key, value):
    # print(key, value)
    self.__dict__[key] = value # 将对象当做字典操作,根据键获取值时会触发该方法
    def __getitem__(self, item):
    # print(item)
    return self.__dict__.get(item) # 将对象当做字典操作,删除指定的键值对时自动触发
    def __delitem__(self, key):
    del self.__dict__[key] xiaoming = Person() xiaoming['name'] = '小明'
    print(xiaoming.__dict__) print(xiaoming['name']) del xiaoming['name']
  • 将对象当做函数调用时,会自动触发下面方法

    class Person:
    # 将对象当做函数调用时,会自动触发该方法
    def __call__(self, *args, **kwargs):
    # print('__call__')
    return sum(args) xiaoming = Person() # 这样操作,需要提供call方法
    ret = xiaoming(1, 2, 3, name='小明')
    print(ret)
  • 函数判断

    class A:
    def __call__(self, *args, **kwargs):
    pass def test():
    pass a = A() # 判断是否可调用
    print(callable(test))
    print(callable(a)) # 判断是否拥有'__call__'属性
    print(hasattr(test, '__call__'))
    print(hasattr(a, '__call__')) # 判断是否是函数
    from inspect import isfunction
    print(isfunction(test))
    print(isfunction(a))

Python基础—11-面向对象(01)的更多相关文章

  1. python基础之面向对象01

    什么是面向对象? 所谓面向对象就是将那些具有共同特质的事物组成一个类(Class),在类中为这些特质定义一个个方法(函数). 具体一点,比如说英雄联盟.在英雄联盟中我们可以把所有的英雄划分为一个英雄类 ...

  2. python基础,函数,面向对象,模块练习

    ---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? #  [] {} () None 0 2,位和字节的关系? # ...

  3. (转)Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...

  4. [.net 面向对象编程基础] (11) 面向对象三大特性——封装

    [.net 面向对象编程基础] (11) 面向对象三大特性——封装 我们的课题是面向对象编程,前面主要介绍了面向对象的基础知识,而从这里开始才是面向对象的核心部分,即 面向对象的三大特性:封装.继承. ...

  5. Python 基础 四 面向对象杂谈

    Python 基础  四  面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...

  6. 自学Python之路-Python基础+模块+面向对象+函数

    自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python    1.1 自学Python1.1-简介    1.2 自学Python1.2-环境的 ...

  7. 二十. Python基础(20)--面向对象的基础

    二十. Python基础(20)--面向对象的基础 1 ● 类/对象/实例化 类:具有相同属性.和方法的一类人/事/物 对象(实例): 具体的某一个人/事/物 实例化: 用类创建对象的过程→类名(参数 ...

  8. 十一. Python基础(11)—补充: 作用域 & 装饰器

    十一. Python基础(11)-补充: 作用域 & 装饰器 1 ● Python的作用域补遗 在C/C++等语言中, if语句等控制结构(control structure)会产生新的作用域 ...

  9. 『Python基础-11』集合 (set)

    # 『Python基础-11』集合 (set) 目录: 集合的基本知识 集合的创建 访问集合里的值 向集合set增加元素 移除集合中的元素 集合set的运算 1. 集合的基本知识 集合(set)是一个 ...

  10. Day7 - Python基础7 面向对象编程进阶

    Python之路,Day7 - 面向对象编程进阶   本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...

随机推荐

  1. geth

    >geth --networkid 123 --dev --datadir "d:/blockchain/project/ethereum" --rpc --rpcaddr ...

  2. windows下快速修改host文件

    windows下快速修改host文件 win+r  输入 notepad c:\Windows\System32\drivers\etc\hosts

  3. 写一个安全的Java单例

    单例模式可能是我们平常工作中最常用的一种设计模式了.单例模式解决的问题也很常见,即如何创建一个唯一的对象.但想安全的创建它其实并不容易,还需要一些思考和对JVM的了解. 1.首先,课本上告诉我,单例这 ...

  4. pythion的定义函数和传递实参

    1.定义函数 例子: def greet_user(): """显示简单的问候语""" print("Hello!")g ...

  5. JAVA常见中文问题的解决方法(转)

    JAVA常见中文问题的解决方法 http://www.java-cn.com/club/article-5876-1.html 以下解决方案是笔者在日常生活中遇到的,希望能对你解决JAVA中文问题有所 ...

  6. sublime Error executing: /usr/bin/security dump-trust-settings -d

    sublime text2突然crash,无法简单粗暴的关闭,就开始认真解决这个问题. 问题: 参考文献:https://github.com/wbond/package_control/issues ...

  7. 【起航计划ObjC 001】印第安老斑鸠ObjC的幻想 ---- Ubuntu下安装并使用Obj-C

    如何在最新版本的 Ubuntu下(14.10)来安装.编译Objective-C? Ubuntu已经有了对Objective-C的编译器(gobjc)的安装,因此安装gobjc的步骤可省,如果你用的U ...

  8. MarkDown和流程图诠释你的代码

    写在前面:首先感谢导师-猴哥对我的认可(求多分享点编程经验.工具.多开课),学习编程是一个痛苦和快乐的过程,希望大家共勉 本文介绍MarkDown的基本语法.使用MarkDown画简单的流程图.使用X ...

  9. SOL的补充

    之前写过一些关于远程安装系统的文档,但是对于SOL还是糊涂不清. Serial Console 可以将输入输出转发到串行接口(com1, com2), 假如你有串行读取设备,就可以看到显示,控制输入. ...

  10. 【Leetcode】【Easy】Binary Tree Level Order Traversal II

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...