Python基础—11-面向对象(01)
面向对象
面向对象
- 与面向过程对比:
- 面向过程:数学逻辑的映射,学会做个好员工
- 面向对象:生活逻辑的映射,学会做个好领导
- 生活实例:
- 类: 人 手机 电脑
- 对象: 我的手机、女朋友的手机 你的那部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)的更多相关文章
- python基础之面向对象01
什么是面向对象? 所谓面向对象就是将那些具有共同特质的事物组成一个类(Class),在类中为这些特质定义一个个方法(函数). 具体一点,比如说英雄联盟.在英雄联盟中我们可以把所有的英雄划分为一个英雄类 ...
- python基础,函数,面向对象,模块练习
---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? # [] {} () None 0 2,位和字节的关系? # ...
- (转)Python成长之路【第九篇】:Python基础之面向对象
一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...
- [.net 面向对象编程基础] (11) 面向对象三大特性——封装
[.net 面向对象编程基础] (11) 面向对象三大特性——封装 我们的课题是面向对象编程,前面主要介绍了面向对象的基础知识,而从这里开始才是面向对象的核心部分,即 面向对象的三大特性:封装.继承. ...
- Python 基础 四 面向对象杂谈
Python 基础 四 面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...
- 自学Python之路-Python基础+模块+面向对象+函数
自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python 1.1 自学Python1.1-简介 1.2 自学Python1.2-环境的 ...
- 二十. Python基础(20)--面向对象的基础
二十. Python基础(20)--面向对象的基础 1 ● 类/对象/实例化 类:具有相同属性.和方法的一类人/事/物 对象(实例): 具体的某一个人/事/物 实例化: 用类创建对象的过程→类名(参数 ...
- 十一. Python基础(11)—补充: 作用域 & 装饰器
十一. Python基础(11)-补充: 作用域 & 装饰器 1 ● Python的作用域补遗 在C/C++等语言中, if语句等控制结构(control structure)会产生新的作用域 ...
- 『Python基础-11』集合 (set)
# 『Python基础-11』集合 (set) 目录: 集合的基本知识 集合的创建 访问集合里的值 向集合set增加元素 移除集合中的元素 集合set的运算 1. 集合的基本知识 集合(set)是一个 ...
- Day7 - Python基础7 面向对象编程进阶
Python之路,Day7 - 面向对象编程进阶 本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...
随机推荐
- RequireJS 2.0 正式发布
就在前天晚上RequireJS发布了一个大版本,直接从version1.0.8升级到了2.0.随后的几小时James Burke又迅速的将版本调整为2.0.1,当然其配套的打包压缩工具r.js也同时升 ...
- [转]微信小程序开发系列(一)小程序开发初体验
本文转自:http://www.cnblogs.com/rennix/p/6287432.html 开发小程序所需的基本技能 关于小程序的介绍和使用场景这里不作介绍,这个系列的文章会一步一步地带领 ...
- sql 行列转换
create table #test1(id int,name varchar(20), Q1 int, Q2 int, Q3 int, Q4 int) insert into #test1 valu ...
- 【Java集合】LinkedList详解前篇
[Java集合]LinkedList详解前篇 一.背景 最近在看一本<Redis深度历险>的书籍,书中第二节讲了Redis的5种数据结构,其中看到redis的list结构时,作者提到red ...
- linux定时任务crontab的使用
crond进程: crond是linux下用来周期性地执行某种任务的一个守护进程,安装操作系统默认会安装此服务工具,并且会自动启动crond进程. 设置定时任务过程: 1. 创建任务文件(.sh) [ ...
- drupal 学习思路
我之前没有学习过框架,用过一个简单的cms.php工作经验有大半年.独立项目经验为0.5.目前在用drupal,用了有三个月,主要是用drupal写app的后台管理和api接口.公司在drupal的基 ...
- 前端小课堂 js:what is the function?
js 函数: 概念:函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. 说白了就是响应用户操作所执行的代码,通过js事件触发,然后调用执行函数里代码的操作. 比如常见的用户点击事件,用户点击 ...
- Hbase到Solr同步常用操作
Hbase到Solr同步常用操作 1. 整体流程 2. 常用操作 Hbase常用操作 Solr常用操作 hbase-index常用操作 3. 其他资料 Lily HBase Indexer使用整理 h ...
- Intent的简单使用
主要实现Intent之间值得转递,如从AActivity到BActivity之间传一个数值,一个实体类,一个集合类 下面代码只要是实现对startActivityForResult的使用,用ABC 3 ...
- setExecuteExistingDelayedTasksAfterShutdownPolicy方法与setContinueExistingPeriodicTasksAfterShutdownPolicy方法的比较
一.setExecuteExistingDelayedTasksAfterShutdownPolicy方法 这个方法大多是与schedule方法和shutdown方法搭配使用的. public voi ...