组合

概念

  • 组合指的是一个对象中的属性是另一个对象

目的

  • 组合的目的和继承一样, 为了减少代码冗余

实现方式

# 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
  • 总结:

    1. 继承: 是一种xx是xx的关系(is-a)
    2. 组合: 是一种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的更多相关文章

  1. Python3 面向对象进阶2

    目录 Classmethod Staticmethod Isinstance Issubclass 反射 概念 hasattr getattr setattr delattr 魔法方法 概念 __ne ...

  2. Python全栈开发【面向对象进阶】

    Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...

  3. python基础——面向对象进阶下

    python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...

  4. Python面向对象进阶和socket网络编程-day08

    写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __i ...

  5. Python中级 —— 01面向对象进阶

    面向对象进阶 总结.补充(http://blog.csdn.net/fgf00/article/details/52479307) 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 ...

  6. python_面向对象进阶(7)

    第1章 面向对象特性—继承(补充) 1.1 接口类.抽象类介绍 1.2 接口类 1.3 接口类应用过程 1.3.1 第一版:完成多种支付方式接口 1.3.2 第二版: 归一化设计,统一支付方式 1.3 ...

  7. Python面向对象进阶和socket网络编程

    写在前面 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __init__(self ...

  8. day021|python之面向对象进阶1

    面向对象进阶 目录 面向对象进阶 1 继承 1.1 继承入门 1.1.1 继承基础 1.1.2 类的基本使用 1.2 多继承 1.2.1 多继承的基本使用 1.2.2 多继承以后的重复性 1.3 类的 ...

  9. day26、面向对象进阶:多态、封装、反射

    一.多态 什么是多态: 类的继承有两层意义:1.改变 2.扩展 多态就是类的这两层意义的一个具体的实现机. 即:调用不同类实例化的对象,下的相同的方法,实现的过程不一样 python中的标准类型就是多 ...

随机推荐

  1. Batch批处理获取当前时间

    这不是一个新问题,但是由于网上写的都是针对自己的电脑设置,没有通用性,而我呢,又需要在不同电脑上使用,因此,这命题一个问题了.其实也没有什么好说的,直接上代码. @ECHO OFF set split ...

  2. 初识JSP:JSP的注释、脚本、声明、表达式

    1.JSP的注释 在HTML当中,如果使用传统的注释我们可以在客户端,也就是网页上右键查看源代码里面看得到该注释,但是JSP注释无法在客户端里看到.源码里面会只会看到JSP注释的地方空出来. 使用方法 ...

  3. 【Mac】【SoupUI】许可证损坏问题

    近期参考 https://www.cnblogs.com/shuaijie/articles/5913750.html#top 安装破解SoupUI 破解方法如下: 截至2014-10-9:SoapU ...

  4. PHP中Session ID的实现原理分析

    ession 的工作机制: 为每个访问者创建一个唯一的 id (UID),并基于这个 UID 来存储变量.UID 存储在 cookie 中,亦或通过 URL 进行传导. PHPSESSIONID的生产 ...

  5. 【笔记】总结Springboot和Vue前后端分离的跨域问题

    跨域一直是个很玄学的问题,SSM的时候又得前后端一起配置,sb的时候又不用. 前端 axios普通get请求 submitForm() { var v=this; this.$axios({ meth ...

  6. Caused by: java.util.zip.ZipException: zip file is empty

    1.问题描述:mybranch分支代码和master分支的代码一模一样,mybranch代码部署到服务器上没有任何问题,而master代码部署到服务器上运行不起来. 2.解决办法: (1)登陆服务器启 ...

  7. JavaScript如何创建一个对象

    我们可以利用JavaScript的语法特征,以类的思想来创建对象. 方法一:原始方法代码如下: <script> var obj = new Object(); obj.name = &q ...

  8. __dict__和dir()的区别

    __dict__和dir()的区别 dir() 一般用来查看模块的属性 __dict__从某方面上来说是dir()的子集 可以直接打印dir(),显示的是当前执行文件所有的属性 __dict__ __ ...

  9. python_MySQL数据库

    MySQL数据库的特点:    1.是关系型数据库        关系型数据库的特点            1.数据是以行和列的的形式存储的            2.这一系列的行和列称为表      ...

  10. windows系统tomcat上开发的j2ee程序,如何适配linux系统上奔跑的websphere7

    公司需要将几个windows系统tomcat中间件下开发的j2ee系统部署到linux系统websphere7中间件下去运行. 这就需要做系统的适配工作.由于时间比较久了,具体问题就不详细写了.把这个 ...