面向对象

- 与面向过程对比
- 面向过程:数学逻辑的映射,学会做个好员工。
- 面向对象:生活逻辑的映射,学会做个好领导。
- 生活实例
- 类: 人 手机 电脑
- 对象: 习大大、普京 二狗的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的更多相关文章

  1. Python学习之==>面向对象编程(二)

    一.类的特殊成员 我们在Python学习之==>面向对象编程(一)中已经介绍过了构造方法和析构方法,构造方法是在实例化时自动执行的方法,而析构方法是在实例被销毁的时候被执行,Python类成员中 ...

  2. Python学习一(面向对象和函数式编程)

    学习了一周的Python,虽然一本书还没看完但是也收获颇多,作为一个老码农竟然想起了曾经荒废好久的园子,写点东西当做是学习笔记吧 对Python的语法看的七七八八了,比较让我关注的还是他编程的思想,那 ...

  3. 从0开始的Python学习014面向对象编程

     简介 到目前为止,我们的编程都是根据数据的函数和语句块来设计的,面向过程的编程.还有一种我们将数据和功能结合起来使用对象的形式,使用它里面的数据和方法这种方法叫做面向对象的编程. 类和对象是面向对象 ...

  4. python学习 day23 面向对象三大特性之继承

    ### 面向对象三大特性值继承#### 1.什么是继承 继承是一种关系,必须存在两个对象才可能产生这种关系,在现实生活中的继承,王思聪可以继承王健林的财产 被继承的成为父,继承的一方成为子 在程序中, ...

  5. Python学习-day6 面向对象概念

    开始学习面向对象,可以说之前的学习和编程思路都是面向过程的,从上到下,一步一步走完. 如果说一个简单的需求,用面向过程实现起来相对容易,但是如果在日常生产,面向对象就可以发挥出他的优势了. 程序的可扩 ...

  6. Python学习之面向对象基础

    python的面向对象和以前学的c++,Java都是一般,大同小异,面向对象基础先谈谈类的构造,编写,属性和方法的可见性等等 1.定义类,创建和使用对象 #定义类 class Student(obje ...

  7. Python学习--10 面向对象编程

    面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 本节对于面向对象的概念不做 ...

  8. python学习总结(面向对象进阶)

    -------------------类属性和实例属性关系------------------- 1.类属性和实例属性关系     1.实例属性         实例对象独有的属性     2.类属性 ...

  9. python学习day19 面向对象(一)封装/多态/继承

    面向对象 封装思想:将同一类的函数函数封装到同一个py文件中,方便调用 面向对象也有封装的作用,将同一类的函数封装到一个类中 多态(鸭子模型):多种类型/多种形态 #,什么事鸭子模型 对于一个函数,p ...

  10. python学习笔记----面向对象

    面向对象 类:成员变量(属性) 方法(操作成员变量) 出一个场景:玩过游戏.主人公,进入了一个场景,有10个小怪物是一样的.有攻击力,血(100格).如果小怪物有多个数值需要管理,小怪物的血量.小怪物 ...

随机推荐

  1. Performing User-Managed Database-18.5、Restoring Control Files

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/offbeatmine/article/details/28429339 18.5.Restoring ...

  2. redis hash类型

  3. mysql中计算两个日期的时间差函数TIMESTAMPDIFF用法

    mysql中计算两个日期的时间差函数TIMESTAMPDIFF用法: 语法: TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2) 说明: 返回日 ...

  4. filter 过滤器从数组中选择一个子集

    输入过滤器可以通过一个管道字符和一个过滤器添加到指令中,该过滤器后面跟着一个冒号:冒号后面是一个模型名称. <!DOCTYPE html><html><head>& ...

  5. C语言结构体排序

    定义学生信息结构体和结构体数组,包括学号.两门百分制成绩和姓名;键盘输入 学生不多于 30 人的信息,以输入成绩为负数或大于 100 作为输入结束;按照学号和平均成绩排序,并输出学生信息 //输入学生 ...

  6. java基础必备单词讲解 day two

    variable 变量 count 统计 sum 总数 salary 薪水 Scanner 接收 import 导入 eclipse 日食 control 控制 shift 改变 alt 替换键 ha ...

  7. VCTransitionsLibrary –自定义iOS交互式转场动画的库

    简介 VCTransitionsLibrary 提供了许多适用于入栈,出栈,模态等场景下控制器切换时的转场动画.它本身提供了一个定义好的转场动画库,你可以拖到自己工程中直接使用;也提供了许多拥有不同转 ...

  8. 关于 Angular引用Material出现node_modules/@angular/material/button-toggle/typings/button-toggle.d.ts(154,104): error TS2315: Type 'ElementRef' is not generic.问题

    百度了好久 ,,,最后谷歌出来了.. 该错误可能来自于您将@ angular / material设置为6.0.0, 但所有其他Angular包都是5.x.您应该始终确保Material主要版本与An ...

  9. HDU.2561 第二小整数(water)

    题目来源:2561 题意分析:找出一堆数中第二小的整数,和题目说的一样 我的思路:冒泡或者sort()一下就ok了,但是我因为没看到多个测试用例还是吃了几记WA . ┭┮﹏┭┮ 完整代码: #incl ...

  10. 微信小程序真机定位问题技巧

    小程序导航 https://wq.xmaht.top 开发者在开发小程序的时候可能会碰到一些这样的问题: 问题1  开发者工具上看效果没问题,但是在真机上测试不行? 问题2  有用户遇到小程序功能无法 ...