20180315-Python面向对象编程设计和开发
1.在子类中调用父类的方法
在子类派生出的新方法中,往往需要重用父类的方法,我们有两种实现方式:
方式一:父类名.父类方法()
Animal.__init__(self,name)
方式二:super().父类方法()
super().__init__(name) #super(Dog,self) 就相当于实例本身了,因为在python3中super()等于super(Dog,self)
两种方式的区别:方式一是跟继承没有关系的,方式二是依赖于继承的,并且即使没有直接继承关系,super()仍然会按照__mro__继续往后查找
class A:
def test(self):
super().test() class B:
def test(self):
print('from B') class C(A,B):
pass c = C()
c.test()
# 打印结果
# from B print(C.__mro__)
# 打印结果
# (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
2.isinstance和issubclass区别?
答:isinstance(obj,cls) 用于检测obj是否为类cls的对象
issubclass(sub,cls) 用于检测sub类是否为cls类的派生类
3.通过__import__('module_name',fromlist=True)的方式,可以以字符串的形式导入模块
4.classmethod和staticmethod装饰器装饰方法的区别?
答:classmethod装饰器装饰的方法,是指绑定到类的方法,代码形式如下:func(cls): pass,自动将类作为第一个参数传入函数,其实对象也可以调用,但仍将类作为第一个参数传入函数
staticmethod装饰器装饰的方法,非绑定方法,不与类和对象绑定,类和对象都可以调用,但是没有自动传入参数那么一说
具体区别请看代码:
class MySQL:
def __init__(self,host,port):
self.host = host
self.port = port @staticmethod
def from_conf():
return MySQL(HOST,PORT) @classmethod
def from_conf(cls):
print(cls)
return cls(HOST,PORT)
5.__dict__用于查看类或对象的命名空间
6.类有两种属性:数据属性和函数属性
- 类的数据属性是共享的,数据属性具体指类的变量属性
class OldboyStudent:
school = 'lufficity' def __init__(self):
pass s1 = OldboyStudent()
s2 = OldboyStudent()
s3 = OldboyStudent() print(id(OldboyStudent.school)) #
print(id(s1.school)) #
print(id(s2.school)) #
print(id(s3.school)) # - 类的函数属性是绑定给对象用的,称为绑定到对象的方法
class OldboyStudent:
school = 'lufficity' def __init__(self):
pass def learn(self):
print('learn') s1 = OldboyStudent()
s2 = OldboyStudent()
s3 = OldboyStudent() print(OldboyStudent.learn) #<function OldboyStudent.learn at 0x105209598>
print(s1.learn) #<bound method OldboyStudent.learn of <__main__.OldboyStudent object at 0x105205320>>
print(s2.learn) #<bound method OldboyStudent.learn of <__main__.OldboyStudent object at 0x105205470>>
print(s3.learn) #<bound method OldboyStudent.learn of <__main__.OldboyStudent object at 0x105205438>>
注意:在obj.name中,会先在obj所在的命名空间寻找name,找不到则去obj所在的类中寻找,类找不到就从父类中寻找,如果还是找不到则抛出异常
7.SubClass.__bases__ 查看继承,__bases__查看所有继承的父类
8.抽象类
抽象类是一个特殊的类,他的特殊之处就在于只能被继承,不能被实例化。
如果说类是从一堆对象中抽取相同内容而来的,那抽象类就是从一堆类中抽取相同内容而来的,内容包括数据属性和函数属性。
从设计的角度来看,如果说类是从现实对象抽象而来的,那么抽象类就是基于类中抽象而来的。
从实现的角度来看,抽象类和普通类的不用之处在于:抽象类只能有抽象方法(没有实现功能),该类不能被实例化,只能被继承,且子类必须实现抽象方法,这一点与接口有点类似。
Python中实现抽象类
from abc import abstractmethod, ABCMeta class AllFile(metaclass=ABCMeta):
all_type = 'file' @abstractmethod # 定义抽象方法,无需实现功能
def read(self):
'子类必须实现功能'
pass @abstractmethod # 定义抽象方法,无需实现功能
def write(self):
'子类必须实现功能'
pass class Txt(AllFile):
def read(self):
print('文本数据的读取方法') def write(self):
print('文本数据的写方法') class Sata(AllFile):
def read(self):
print('硬盘数据读取方法') def write(self):
print('硬盘数据的写方法') txt = Txt()
st = Sata() # 这样大家都被归一化了,也就是一切皆文件都思想
txt.read()
st.write() print(txt.all_type)
print(st.all_type)
抽象类和接口的区别:
抽象类的本质还是类,指的是一组类的相似性,包括数据属性和函数属性,而接口强调函数属性的相似性
抽象类是介于类和接口的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计
9.在继承中如果父类不想让子类覆盖自己的方法,可以将方法定义的私有化 __func
10.封装方法:目的是隔离复杂度
# 封装方法:隔离复杂度
# 取款功能:这个功能是由多个功能组成的,包括插卡、用户验证、输入金额、打印账单、取钱
# 对于使用者来说,只关心取钱功能,其他的功能是可以隐藏起来的
# 隔离了复杂度,而且提高的安全性
class ATM:
def __card(self):
print('插卡') def __auth(self):
print('用户验证') def __input(self):
print('输入金额') def __print_bill(self):
print('打印账单') def __take_money(self):
print('取钱') def withdraw(self):
self.__card()
self.__auth()
self.__input()
self.__print_bill()
self.__take_money() atm = ATM()
atm.withdraw()
11.特性
property是一种特殊属性,访问时他会执行一段功能(函数),然后返回值
import math class Circle:
def __init__(self,radius):
self.radius = radius @property
def area(self): # 计算圆的面积
return math.pi * self.radius ** 2 @property
def perimeter(self): # 计算圆的周长
return 2 * math.pi * self.radius c = Circle(10) print('圆的面积:',c.area)
print('圆的周长:',c.perimeter)
注意:此时的area、perimeter不能被赋值
为什么要用property?
将一个函数定义成一个特性后,对象再去使用的时候obj.name,根本无法察觉name是通过函数计算出来的,这种特性的使用遵循了归一化的设计
除此之外:
面向对象的的封装有三种方式:
public
这种其实就是不封装,对外公开
protected
这种封装对外不公开,但是对其朋友、子类公开
priviate
这种封装其实对谁都不公开
Python其实并没有把这三种封装到class机制中,在C++里面一般都会将所有的数据设置为所有的,然后提供get和set方法获取和设置,在Python中通过property方法去实现
class Foo:
def __init__(self,val):
self.__NAME = val # 将数据属性都隐藏起来 @property
def name(self):
return self.__NAME # obj.name访问的是self.__NAME @name.setter
def name(self,value):
if not isinstance(value,str): # 在设定值之前进行检查
raise TypeError('%s must be str' % value)
self.__NAME = value f = Foo('egon')
print(f.name)
f.name = 'alex'
print(f.name)
20180315-Python面向对象编程设计和开发的更多相关文章
- python面向对象编程设计与开发
一.什么是面向对象的程序设计 1.何为数据结构? 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合,如列表.字典. 2.何为编程? 编程是指程序员用特定的语法+数据结构+算法,组成的代码,告 ...
- Python全栈开发之路 【第七篇】:面向对象编程设计与开发(1)
本节内容 一.编程范式 编程指的是写程序.敲代码,就是指程序员用特定的语法.数据结构和算法编写的代码,目的是来告诉计算机如何执行任务的. 在编程的世界里最常见的两大流派是:面向过程与面向对象.“功夫的 ...
- Python全栈开发之路 【第八篇】:面向对象编程设计与开发(2)
一.继承与派生 什么是继承? 继承指的是类与类之间的关系,是一种什么是什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创建新的类的方式,在python中,新建的类可以继承一个或多个父类 ...
- Python面向对象编程指南
Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...
- Python面向对象编程——继承与派生
Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...
- python面向对象编程进阶
python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...
- Python 面向对象编程 继承 和多态
Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...
- Python 面向对象编程基础
Python 面向对象编程基础 虽然Pthon是解释性语言,但是Pthon可以进行面向对象开发,小到 脚本程序,大到3D游戏,Python都可以做到. 一类: 语法: class 类名: 类属性,方法 ...
- python面向对象编程学习
python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...
随机推荐
- [CF] 8C Looking for Order
状压模板题 CF难度2000? 我得好好了解一下CF的难度机制了 反正CF的难度比洛谷真实就好了 Code #include<algorithm> #include<iostream ...
- Python---基础---数据类型的内置函数
2019-05-23 ---------------------------- 一. #数据类型的内置函数Python有哪些数据类型?Number 数值型string 字符型list ...
- spring boot整合WebSocket示例
1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/springBo ...
- python 全栈开发,Day53(jQuery的介绍,jQuery的选择器,jQuery动画效果)
01-jQuery的介绍 1.为什么要使用jQuery 在用js写代码时,会遇到一些问题: window.onload 事件有事件覆盖的问题,因此只能写一个事件. 代码容错性差. 浏览器兼容性问题. ...
- GIS网络分析
https://wenku.baidu.com/view/297ec6a90029bd64783e2cb2.html 缓冲区分析 点线面的数据分析 分布式存储与分析 并行计算 #分布式存储与并行计算# ...
- Eclipse中安装和使用FindBugs
FindBugs在Eclipse的离线安装: 1 到http://findbugs.sourceforge.net/downloads.html下载20131115123549_nlpir_ict ...
- [CSP-S模拟测试]:sum(数学+莫队)
题目传送门(内部题63) 输入格式 第一行有一个整数$id$,表示测试点编号.第一行有一个整数$q$,表示询问组数.然后有$q$行,每行有两个整数$n_i,m_i$. 输出格式 一共有$q$行,每行一 ...
- php面试专题---8、会话控制考点
php面试专题---8.会话控制考点 一.总结 一句话总结: 主要是cookie和session的区别,以及用户禁用cookie之后怎么使用session 1.为什么要使用会话控制技术? 因为http ...
- P1983车站分级
%%%rqy 传送 我们注意到题目中这段话: 既然大于等于x的站都要停,那么不停的站的级别是不是都小于x?(这里讨论在始发站和终点站以内的站(注意这里是个坑)) 我们可以找出每趟车没停的站,向所有停了 ...
- NOIP 真题选讲
推荐生要凉辽 这可能是我更新的最后一篇博客 代码什么的有时间再说吧,先讲思路.(已搞定前三题代码) 首先先看一下线段覆盖题.我们有一个区间,要用线段覆盖整个区间. 这个是线段的覆盖简图.我们如何选取最 ...