Python3 面向对象进阶1
组合
概念
- 组合指的是一个对象中的属性是另一个对象
目的
- 组合的目的和继承一样, 为了减少代码冗余
实现方式
# 1
class Other:
def func(self):
print('from other')
class Foo:
def __init__(self):
self.other = other()
def func(self):
self.other.func()
foo = Foo()
foo.func() # from other
# 2
class Other:
def func(self):
print('from other')
class Foo:
pass
foo = Foo()
other_obj = Other()
foo.func = other_obj.func
foo.func() # from other
- 总结:
- 继承: 是一种xx是xx的关系(is-a)
- 组合: 是一种xx有xx的关系(has-a)
封装
概念
封装指的是把一系列属性(特征和技能)放到一个类中就构成了封装
存数据的目的是为了取, 对象可以通过
.的方式获取属性
目的
- 封装的目的是方便取用, 对象可以通过
对象.属性的方式获取属性
实现方式
- 定义类时, 把一系列属性(特征和技能)放到一个类中就构成了封装
访问限制
概念
- 在类内部, 凡是以__开头的属性都会被隐藏起来, 外部不能直接访问
目的
- 对重要或隐私数据获取的更加严谨, 进而保证了数据的安全
- 隐私属性可以通过在类内部封装一个接口, 在接口内做业务逻辑处理, 再把数据返回给调用者
- 注意: 在Python中, 不会强制限制属性的访问, 类内部__开头的属性, 只是做了一种变形, 若想访问, 调用变形后的名字即可
class Foo:
__name = 'bigb'
def __func(self):
print('secret')
foo = Foo()
print(foo._Foo__name) # bigb
foo._Foo__func() # secret
实现方式
# 1
class PyMan:
language = 'Python'
def __init__(self, name, age, gender):
self.__name = name
self.__age = age
self.__gender = gender
# 打印用户信息接口
def get_info(self):
username = input('请输入用户名: ')
password = input('请输入密码: ')
if username == 'bigb' and password == '123':
print(f'''
姓名: {self.__name}
年龄: {self.__age}
性别: {self.__gender}
''')
# 修改用户信息接口
def set_info(self, name, age, gender):
if not isinstance(name, str):
raise TypeError
if not isinstance(age, int):
raise TypeError
if not isinstance(gender, str):
raise TypeError
self.__name = name
self.__age = age
self.__gender = gender
bigb = PyMan('bigb', 18, 'male')
bigb.get_info()
bigb.set_info()
# 2
class ATM:
def __insert_card(self):
print('插卡')
def __input_pwd(self):
print('输入密码')
def __input_money(self):
print('输入金额')
def __get_monet(self):
print('执行吐钱')
def __print_bill(self):
print('打印账单')
def withdraw(self):
self.__insert_card()
self.__input_pwd()
self.__input_money()
self.__get_monet()
self.__print_bill()
print('取款程序执行完毕!')
atm = ATM()
atm.withdraw()
'''
插卡
输入密码
输入金额
执行吐钱
打印账单
取款程序执行完毕!
'''
property
概念
- Python内置的装饰器, 主要给类内部的方法使用
目的
- 是将类内部的方法
def 方法名():变成了def 方法: - 在对象调用某个方法时, 将
对象.方法名()变成对象.方法名, 使其看起来像一个普通的数据属性
实现方式
@property
class People:
def __init__(self, name, weight, height):
self.name = name
self.weight = weight
self.height = height
@property
def bmi(self):
return self.weight / (self.height * self.height)
bigb = People('bigb', 70, 1.8)
# 如果不用@property, 则print(bigb.bmi())
print(bigb.bmi)
多态
概念
不同的子类对象调用相同的父类方法, 产生不同的执行结果
以继承和重新父类方法为前提
是调用方法的技巧, 不会影响类的内部设计
目的
- 多态可以增加代码的灵活度
抽象类
概念
- abc 模块
目的
- 强制在定义子类时必须定义和父类的相同的方法
实现方法
import abc
import abc
class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod
def eat(self):
pass
@abc.abstractmethod
def drink(self):
pass
class Pig(Animal):
def eat(self):
print('pig is eating...')
peppa = Pig()
TypeError: Can't instantiate abstract class Pig with abstract methods drink
父类方法被 @abc.abstractmethod装饰后, 子类必须也有相同的方法, 否则会报错
鸭子类型
- 当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子
- 不关注类型, 只关注方法
- 继承: 耦合度高, 程序的可扩展性差
- 鸭子类型: 程序的可扩展性强
Python3 面向对象进阶1的更多相关文章
- Python3 面向对象进阶2
目录 Classmethod Staticmethod Isinstance Issubclass 反射 概念 hasattr getattr setattr delattr 魔法方法 概念 __ne ...
- Python全栈开发【面向对象进阶】
Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...
- python基础——面向对象进阶下
python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...
- Python面向对象进阶和socket网络编程-day08
写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __i ...
- Python中级 —— 01面向对象进阶
面向对象进阶 总结.补充(http://blog.csdn.net/fgf00/article/details/52479307) 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 ...
- python_面向对象进阶(7)
第1章 面向对象特性—继承(补充) 1.1 接口类.抽象类介绍 1.2 接口类 1.3 接口类应用过程 1.3.1 第一版:完成多种支付方式接口 1.3.2 第二版: 归一化设计,统一支付方式 1.3 ...
- Python面向对象进阶和socket网络编程
写在前面 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __init__(self ...
- day021|python之面向对象进阶1
面向对象进阶 目录 面向对象进阶 1 继承 1.1 继承入门 1.1.1 继承基础 1.1.2 类的基本使用 1.2 多继承 1.2.1 多继承的基本使用 1.2.2 多继承以后的重复性 1.3 类的 ...
- day26、面向对象进阶:多态、封装、反射
一.多态 什么是多态: 类的继承有两层意义:1.改变 2.扩展 多态就是类的这两层意义的一个具体的实现机. 即:调用不同类实例化的对象,下的相同的方法,实现的过程不一样 python中的标准类型就是多 ...
随机推荐
- 用大写字母输入 Linux 命令,实现以 sudo 用户权限运行
我们知道,一些 Linux 命令是要通过 sudo 权限才能运行的,这需要我们每次使用这些命令时在前面加一个 sudo ,十分繁琐.今天给大家介绍一个好用的工具 SUDO ,它只需要我们用大写字母键入 ...
- java编程思想第四版第五章总结
1. 构造器 构造器的一个重要的作用: 保证对象被使用之前初始化了. 构造器是一种特殊类型的方法, 因为他没有返回值.这与返回值为空(void)明显不同.对于空返回值,尽管方法本身不会自动返回什么, ...
- 反汇编分析NSString,你印象中的NSString是这样吗
我们先来定义三个NSString -(void) testNSString { NSString* a = @"abc"; NSString* b = [NSString stri ...
- LVM扩容案例
LVM基础命令: pvdisplay 查看检查pv pvremove /dev/sdb #清除一个pv fdisk -l 检查磁盘 df -h 检查全部磁盘大小 df -Th 检查磁盘大小和分区格式类 ...
- 页面加载和图片加载loading
准备放假了!也是闲着了 ,就来整理之前学到或用到的一下知识点和使用内容,这次记录的是关于加载的友好性loading!!!这里记录一下两种加载方法 1.页面加载的方法,它需要用到js里面两个方法 doc ...
- OpenStack集成ceph
openstack组件集成ceph OpenStack集成ceph详细过程可以查看ceph官方文档:ceph document OpenStack Queens版本,1台控制节点controller, ...
- linux 相关零碎知识整理
1.启动bash shell 大部分linux系统启动用户命令行接口(cli)环境时使用默认的bash shell,在bash shell启动时,它将自动执行位于用户主目录下的.bashrc中的命令. ...
- 题解——面积(area.cpp)
题目来源&题面简述: 思路与算法选择: 只有*里面的部分对我们有用,所以可以将 *号外的部分标记一下. 可以用著名的BFS大法实现此过程.(连通块) 连通块模板: #include<bi ...
- JNI教程与技术手册
转载请标明出处:http://blog.csdn.net/shensky711/article/details/52806794 本文出自: [HansChen的博客] 概述 对于JNI,有些童鞋在没 ...
- 小白学 Python 爬虫(11):urllib 基础使用(一)
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...