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格).如果小怪物有多个数值需要管理,小怪物的血量.小怪物 ...
随机推荐
- Performing User-Managed Database-18.5、Restoring Control Files
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/offbeatmine/article/details/28429339 18.5.Restoring ...
- redis hash类型
- mysql中计算两个日期的时间差函数TIMESTAMPDIFF用法
mysql中计算两个日期的时间差函数TIMESTAMPDIFF用法: 语法: TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2) 说明: 返回日 ...
- filter 过滤器从数组中选择一个子集
输入过滤器可以通过一个管道字符和一个过滤器添加到指令中,该过滤器后面跟着一个冒号:冒号后面是一个模型名称. <!DOCTYPE html><html><head>& ...
- C语言结构体排序
定义学生信息结构体和结构体数组,包括学号.两门百分制成绩和姓名;键盘输入 学生不多于 30 人的信息,以输入成绩为负数或大于 100 作为输入结束;按照学号和平均成绩排序,并输出学生信息 //输入学生 ...
- java基础必备单词讲解 day two
variable 变量 count 统计 sum 总数 salary 薪水 Scanner 接收 import 导入 eclipse 日食 control 控制 shift 改变 alt 替换键 ha ...
- VCTransitionsLibrary –自定义iOS交互式转场动画的库
简介 VCTransitionsLibrary 提供了许多适用于入栈,出栈,模态等场景下控制器切换时的转场动画.它本身提供了一个定义好的转场动画库,你可以拖到自己工程中直接使用;也提供了许多拥有不同转 ...
- 关于 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 ...
- HDU.2561 第二小整数(water)
题目来源:2561 题意分析:找出一堆数中第二小的整数,和题目说的一样 我的思路:冒泡或者sort()一下就ok了,但是我因为没看到多个测试用例还是吃了几记WA . ┭┮﹏┭┮ 完整代码: #incl ...
- 微信小程序真机定位问题技巧
小程序导航 https://wq.xmaht.top 开发者在开发小程序的时候可能会碰到一些这样的问题: 问题1 开发者工具上看效果没问题,但是在真机上测试不行? 问题2 有用户遇到小程序功能无法 ...