python学习总结---面向对象1
面向对象
- 与面向过程对比
  - 面向过程:数学逻辑的映射,学会做个好员工。
  - 面向对象:生活逻辑的映射,学会做个好领导。
- 生活实例
  - 类:          人               手机              电脑
  - 对象:       习大大、普京              二狗的iphoneX            生辉桌上的电脑
- 官方定义
  - 类:具有相同特征(属性和行为)事物的抽象
  - 对象:某个类的具象
- 编程语言
  - 类:是一种自定义的数据类型
  - 对象:某个类类型的变量
面向对象语法
- 类的定义
      class 类名:
        pass
- 语法说明
  - 定义类需要使用关键字class
  - 类名:原则上符合标识符命名规范即可,但是通常我们都采用大驼峰风格命名,如:UserName
  - 类名后面的':'不要忘记
  - 类的内容要进行整体缩进
  - 行为通过方法体现
  - 属性通过变量体现,需要动态添加
  - 成员访问:
    - 属性:对象.属性名
    - 方法:对象.方法名()
  - 示例:
      # 定义类
      class Person:
          # 行为时通过方法体现的
          # 吃饭
          def eat(self):
              print('红烧鸡腿我喜欢吃')
          # 睡觉
          def sleep(self):
              print('睡觉是一种生活态度')
      # 创建对象
      hui = Person()
      # 属性时动态添加的
      hui.age = 30
      hui.height = 170
      print(hui.age)
      # 调用对象方法
      hui.eat()
- self使用
      class Person:
          def run(self):
              # self表示当前对象,就是调用该方法的对象
              print('{}每天以2m/s的速度慢跑5km'.format(self.name))
        def introduce(self):
              # 不但可以访问成员属性
              print('我叫{}今年18岁'.format(self.name))
              # 还可以调用成员方法
              # self参数可以使用其他名字,调用方法时不需要传递
              self.run()
      hui = Person()
      hui.name = '生辉'
      # hui.run()
      fei = Person()
      fei.name = '赵飞'
      # fei.run()
      fei.introduce()
- __str__方法
        class Person:
            # 默认打印对象,显示类名+地址
            # 重写该方法,打印该方法的返回值
            def __str__(self):
                return '我叫{},今年{}岁'.format(self.name, self.age)
        james = Person()
        james.name = '勒布朗.詹姆斯'
        james.age = 33
        print(james)
- __init__方法
      class Cat:
          def __str__(self):
              return 'name:{},age:{},color:{}'.format(self.name, self.age, self.color)
          # 构造方法:创建对象后,会自动调用该方法完成初始化设置
          def __init__(self, name, age, color):
              # print('__init__', name, age, color)
              self.name = name
              self.age = age
              self.color = color
      # 这种方案比较繁琐
      # jiafei = Cat()
      # jiafei.name = '加菲'
      # jiafei.age = 2
      # jiafei.color = '橘黄色'
      # print(jiafei)
      jiafei = Cat('加菲', 2, '橘黄色')
      print(jiafei)        
- __del__方法
        class Pig:
            # 析构方法:当对象释放时,系统会自动调用
            # 若手动使用del删除:则会立即调用该方法
            # 该方法一般做资源释放操作,如:数据库断开连接,文件关闭
            def __del__(self):
                print('大师兄,我不行了')
        bajie = Pig()
        del bajie
        print('八戒,一路走好')
- 思考:小明手里有2张牌,左手♥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=None):
              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()
- 练习:设计一个数学类,属性有两个数,方法:加、减、乘、除,展示成员
常用内置函数
- 内置函数:在类中,特定时机自动回触发的函数。
  - 设置、获取、销毁属性时自动触发的方法:
      class Person:
          def __str__(self):
              return '姓名:{}'.format(self.name)
          def __init__(self, name):
              self.name = 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('小明')  
      # print(xiaoming.age)
      # print(xiaoming.weight)
      xiaoming.age = 20
      # 存放了所有的对象属性
      # print(xiaoming.__dict__)
      # print(xiaoming.age)
      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):
              print(key, '即将销毁')
              del self.__dict__[key]
      xiaoming = Person()
      xiaoming['name'] = '小明'
      # print(xiaoming.name)
      print(xiaoming['name'])
      del xiaoming['name']
- 将对象当做函数调用
      class Person:
        # 将对象当做函数调用时,会自动触发该方法
        def __call__(self, *args, **kwargs):
            # print('__call__', args)
            return sum(args)
      xiaoming = Person()
      # 如果想这样调用,必须重写__call__方法
      ret = xiaoming(1, 2, 3)
      print(ret)
- 判断一个对象是否可以调用,是否拥有某属性,是否是函数
      def test():
        pass
      # 判断一个对象能否被调用
      print(callable(xiaoming))
      print(callable(test))
      # 判断一个对象是否拥有__call__属性
      print(hasattr(test, '__call__'))
      print(hasattr(xiaoming, '__call__'))
      # 判断一个对象是否是函数
      from inspect import isfunction
      print(isfunction(test))
      print(isfunction(xiaoming))												
											python学习总结---面向对象1的更多相关文章
- Python学习之==>面向对象编程(二)
		
一.类的特殊成员 我们在Python学习之==>面向对象编程(一)中已经介绍过了构造方法和析构方法,构造方法是在实例化时自动执行的方法,而析构方法是在实例被销毁的时候被执行,Python类成员中 ...
 - Python学习一(面向对象和函数式编程)
		
学习了一周的Python,虽然一本书还没看完但是也收获颇多,作为一个老码农竟然想起了曾经荒废好久的园子,写点东西当做是学习笔记吧 对Python的语法看的七七八八了,比较让我关注的还是他编程的思想,那 ...
 - 从0开始的Python学习014面向对象编程
		
简介 到目前为止,我们的编程都是根据数据的函数和语句块来设计的,面向过程的编程.还有一种我们将数据和功能结合起来使用对象的形式,使用它里面的数据和方法这种方法叫做面向对象的编程. 类和对象是面向对象 ...
 - python学习 day23 面向对象三大特性之继承
		
### 面向对象三大特性值继承#### 1.什么是继承 继承是一种关系,必须存在两个对象才可能产生这种关系,在现实生活中的继承,王思聪可以继承王健林的财产 被继承的成为父,继承的一方成为子 在程序中, ...
 - Python学习-day6 面向对象概念
		
开始学习面向对象,可以说之前的学习和编程思路都是面向过程的,从上到下,一步一步走完. 如果说一个简单的需求,用面向过程实现起来相对容易,但是如果在日常生产,面向对象就可以发挥出他的优势了. 程序的可扩 ...
 - Python学习之面向对象基础
		
python的面向对象和以前学的c++,Java都是一般,大同小异,面向对象基础先谈谈类的构造,编写,属性和方法的可见性等等 1.定义类,创建和使用对象 #定义类 class Student(obje ...
 - Python学习--10 面向对象编程
		
面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 本节对于面向对象的概念不做 ...
 - python学习总结(面向对象进阶)
		
-------------------类属性和实例属性关系------------------- 1.类属性和实例属性关系 1.实例属性 实例对象独有的属性 2.类属性 ...
 - python学习day19  面向对象(一)封装/多态/继承
		
面向对象 封装思想:将同一类的函数函数封装到同一个py文件中,方便调用 面向对象也有封装的作用,将同一类的函数封装到一个类中 多态(鸭子模型):多种类型/多种形态 #,什么事鸭子模型 对于一个函数,p ...
 - python学习笔记----面向对象
		
面向对象 类:成员变量(属性) 方法(操作成员变量) 出一个场景:玩过游戏.主人公,进入了一个场景,有10个小怪物是一样的.有攻击力,血(100格).如果小怪物有多个数值需要管理,小怪物的血量.小怪物 ...
 
随机推荐
- VPS一键测试脚本 / 自带结果导出
			
脚本命令 一下脚本可能卡住,运行时间长,建议在screen中运行. 1.秋水逸冰大佬的Bench.sh脚本 特点:用时较短,对系统测试全面,英文:但缺少国内节点测速 有趣的是,bench.sh既是脚本 ...
 - 某寺庙,有小和尚、老和尚若干。有一水缸,由小和尚用水桶从井中提水入缸,老和尚用水桶从缸里取水饮用。水缸可容10桶水,水取自同一井中。水井径窄,每次只能容一个水桶取水。水桶总数为3个。每次入、取缸水仅为1桶,且不可以同时进行。试用P、V操作给出小和尚、老和尚动作的算法描述。
			
寺庙和尚打水 设信号量mutex_gang, mutex_jing, gang_empty, gang_full, count分别表示使用缸互斥, 使用井互斥, 缸空, 缸满, 水桶总个数 semap ...
 - 2017.11.10 web中URL和URI的区别
			
URI:Uniform Resource Identifier,统一资源标识符: •URL:Uniform Resource Locator,统一资源定位符: •URN:Uniform Resourc ...
 - css隐藏元素的六类13种方法
			
隐藏元素的方法 隐藏元素的方法可以总结为六类:直接隐藏.对溢出内容隐藏.对元素透明度进行调整.将元素移除当前屏幕.对元素的层级关系进行调整.对元素进行裁剪 只有对元素的透明度进行调整才可以点击,其余都 ...
 - MyBatis简单了解
			
MyBatis 是什么? MyBatis 是一个简化和实现了 Java 数据持久化层(persistence layer)的开源框架,它抽象了大量的 JDBC 冗余代 码,并提供了一个简单易用的 AP ...
 - input的类型为number,限制输入的数字位数
			
<input type="text" maxlength="5" /> 效果ok,当 <input type="number& ...
 - cordova-plugin-themeablebrowser 0.2.17 "ThemeableBrowser"ionic跳转外链插件在ios中heardBar会遮住内容的bug
			
ionic+angular的app项目中需要在App打开一个外部的url链接,用了这个插件发现在iPhone手机中会出现toolbar挡住url页面内容 解决方法: 在原有基础上加上statusBar ...
 - 使用工具Android Studio实现一个简单的Android版的新闻APP
			
目的: 这是我学完Android课程后所写的一个小的.简单版的新闻APP 技术概要: 用到了SQLite数据库,用它来存储每篇新闻下的评论 新闻的来源是新浪新闻,我通过使用Fiddler来对新浪新闻A ...
 - BZOJ2683: 简单题(cdq分治 树状数组)
			
Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 2142 Solved: 874[Submit][Status][Discuss] Descripti ...
 - SSH 登录时出现如下错误:No supported key exchange algorithms
			
https://help.aliyun.com/knowledge_detail/41486.html